翻译任务结果

Translate task result

我有一个 returns Task<T> 的外部库。我的库包装了这个调用并进行了翻译和 returns Task<T2>。如何在不使用 .Wait().Result 的情况下创建将在任务完成时 运行 的任务?感觉 .ContinueWith() 应该这样做,但我在语法上苦苦挣扎,因为 ContineWith() 似乎是由前面的任务驱动的,而我想转换为 T2。如果我在先行词上使用 .Result,Task.FromResult<T2>() 会起作用,但同样,我理想情况下想要链接。

Task<Hamburger> GetHambrugerAsync()
{
   Task<Cow> t1 = _extlib.GetCowAsync();
   return Task.Factory.StartNew<Hamburger>(() => 
   {
      t1.Wait();
      return Hamburger();
   });
}

假设您有一个 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)
}

两种方式都将 return 变成 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));
}