StartNew()是否需要异步和解包?

时间:2018-08-30 14:12:35

标签: c# async-await task-parallel-library

我有此代码:

var task = Task.Factory.StartNew(() => service.StartAsync(ct), ct);

但是我想知道是否应该是这样:

var task = Task.Factory.StartNew(async () => await service.StartAsync(ct), ct).Unwrap();

第一个正确的启动我的异步服务吗?还是第二个更好?

1 个答案:

答案 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,而不是内部工作。