TPL , , . - CancellationTokenSource, RunFuncX.
static void Main()
{
InputDataType data = getMyData();
OutputDataType x = Foo(data).Result;
}
static async Task<OutputDataType> Foo(InputDataType data)
{
var cts = new CancellationTokenSource();
var task1 = Task.Factory.StartNew(() => RunFunc1(data, cts.Token));
var task2 = Task.Factory.StartNew(() => RunFunc2(data, cts.Token));
var task3 = Task.Factory.StartNew(() => RunFunc3(data, cts.Token));
var tasks = new [] { task1, task2, task3 };
while (tasks.Any())
{
var completedTask = await Task.WhenAny(tasks);
if (IsResultGood(completedTask.Result))
{
cts.Cancel();
return completedTask.Result;
}
tasks = tasks.Where(t => t != completedTask).ToArray();
}
return null;
}
Spo1ler Foo . , # 5.0. await, . , , Result.