【问题标题】:Is async and unwrap necessary for StartNew()? [duplicate]StartNew() 是否需要异步和展开? [复制]
【发布时间】:2018-08-31 05:54:43
【问题描述】:

我有这个代码:

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

但我想知道是否应该改为:

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

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

【问题讨论】:

  • 与其创建一个任务,将其包装在另一个任务中,将其解包在另一个任务中,再将其包装在一个任务中,然后再次将其解包在一个任务中,为什么不干脆不包装首先在另一个任务中完成任务?只需写var task = service.StartAsync(ct);,因为该操作已经是异步的。
  • 任务task = service.StartAsync(ct);阻塞直到服务完成,这不是期望的行为。
  • 不,它没有。它是异步的。这就是为什么它的名称中有Async 并返回Task。如果它不是异步的,则不应返回 Task 并且名称中不应包含 Async,或者它有一个需要修复以使其异步的错误。

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


【解决方案1】:

考虑返回的任务类型,第一个产生Task<Task<int>>,而第二个产生Task<int>。所以实际上第一个是 Task 代表内部任务的启动,而第二个展开后代表内部方法返回的 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 而不是它所做的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多