我有此代码:
var task = Task.Factory.StartNew(() => service.StartAsync(ct), ct);
但是我想知道是否应该是这样:
var task = Task.Factory.StartNew(async () => await service.StartAsync(ct), ct).Unwrap();
第一个正确的启动我的异步服务吗?还是第二个更好?
答案 0 :(得分:0)
请考虑返回的任务类型,第一个任务产生Task<Task<int>>
,第二个任务产生Task<int>
。因此,实际上第一个是Task
,它代表内部任务的开始,而第二个是未包装的,代表由表示服务启动的inner方法返回的Task
。最后,您也可以先Unwrap
并获得相同的效果,而无需使用async/await
,这里不需要。在这种情况下,这些内容都无法真正满足StartNew
的需求,只需查看您所查看的返回类型即可。
考虑以下代码:
public class AsyncTesting
{
public void StartServiceTest()
{
Task<Task<int>> tsk1 = Task.Factory.StartNew(() => StartAsync());
Task<int> tsk2 = Task.Factory.StartNew(() => StartAsync()).Unwrap();
Task<int> tsk3 = Task.Factory.StartNew(async () => await StartAsync()).Unwrap();
}
public Task<int> StartAsync() => Task.Delay(2500).ContinueWith(tsk => 1);
}
不Unwrap
的方法返回一个Task
,表示启动内部Task
,而不是内部工作。