我有一个返回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));
答案 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));
}