翻译任务结果

时间:2015-06-01 17:52:05

标签: c# task-parallel-library

我有一个返回Task<T>的外部库。我的库包装了这个调用并进行翻译并返回Task<T2>。如何在不使用.Wait().Result的情况下创建将在完成任务时运行的任务?像.ContinueWith()这样的感觉应该这样做,但我在语法上挣扎,因为ContineWith()似乎是由前期任务驱动的,而我想转移到T2。 Task.FromResult<T2>()如果我在前面使用了.Result,那么Task<Hamburger> GetHambrugerAsync() { Task<Cow> t1 = _extlib.GetCowAsync(); return Task.Factory.StartNew<Hamburger>(() => { t1.Wait(); return Hamburger(); }); } 会有效。但是,理想情况下,我想要链接。

ptrStack stack = (ptrStack)malloc(sizeof(Stack));

1 个答案:

答案 0 :(得分:2)

假设您有一个T2 GetT2(T1 input)功能。

你有几种方法:

public Task<T2> GetT2Async(Task<T1> task)
{
    return task.ContinueWith(t => GetT2(t.Result), TaskContinuationOptions.OnlyOnRanToCompletion);
}

或者,使用async

public async Task<T2> GetT2Async(Task<T1> task)
{
    return GetT2(await task); // You may want to add .ConfigureAwait(false)
}

这两种方式都会返回Task<T2>,该任务将在任务完成后从Task<T1> 执行转换。

用你的例子:

async Task<Hamburger> GetHambrugerAsync()
{
   Cow cow = await _extlib.GetCowAsync();
   return new Hamburger(cow);
}

或者:

Task<Hamburger> GetHambrugerAsync()
{
   Task<Cow> cowTask = _extlib.GetCowAsync();
   return cowTask.ContinueWith(t => new Hamburger(t.Result, TaskContinuationOptions.OnlyOnRanToCompletion));
}