Хочу написать что то типа такого:
async Task<MyResult> MyAsyncFunc()
{
var x = SyncFunc();
var y = await AsynсFunc(x);
return OtherSyncFunc(y);
}
на C# 4 без всяких CTP.
Имеется Select/SelectMany для тасков
можно написать так:
Task.Factory.StartNew(SyncFunc).SelectMany(AsyncFunc).Select(OtherSyncFunc)
но функция SyncFunc — очень короткая и дегать из-за ней пул потоков не хочется, хочется аналог TaskContinuationOptions.ExecuteSynchronously в перечислении TaskCreationOptions.
Как быть?
Блин, всё, пора домой, совсем к вечеру голова того. Размякла.
вот, может кому пригодтся:
public static Task<TResult> CreateSyncTask<TResult>(Func<TResult> action)
{
var tcs = new TaskCompletionSource<TResult>();
try
{
tcs.SetResult(action());
}
catch (Exception ex)
{
tcs.SetException(ex);
}
return tcs.Task;
}