翻译任务结果
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));
}
我有一个 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));
}