【问题标题】:Async/await with a task, refactoring method带任务的异步/等待,重构方法
【发布时间】:2018-12-21 03:27:46
【问题描述】:

在下面的 .net 代码中,当方法中还有任务时需要 async/await 吗?

transaction.execute 返回一个字符串,然后由方法返回。这是一种运行缓慢的方法。

我知道 async/await 使用状态机在主线程上运行,并且该任务将在线程池线程上运行。

重构此方法的最佳方法是什么,或者它是否可以?

  public async Task<string> ExecuteTransaction(ITransaction transaction)
  {
        var task = new Task<string>(transaction.Execute);

        task.Start();

        var taskResult = await task;

        return taskResult;
  }

【问题讨论】:

  • 除非你知道自己在做什么,否则绝对远离var task = new Task&lt;string&gt;(transaction.Execute); task.Start();
  • 你为什么这么说是出于兴趣?
  • 有很多原因。第一个是性能,第二个是它引入了错误和同步问题。在某些情况下,您想使用Start。看看这里blogs.msdn.microsoft.com/pfxteam/2012/01/14/faq-on-task-start

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


【解决方案1】:

你可以用Task.Run大大简化它

public Task<string> ExecuteTransactionAsync(ITransaction transaction) {
    return Task.Run(transaction.Execute);
}

在上述情况下确实没有理由保持等待,但是在您需要在任务之后调用代码的情况下

public async Task<string> ExecuteTransactionAsync(ITransaction transaction) {
    var taskResult = await Task.Run(transaction.Execute);

    //...

    return taskResult;        
}

【讨论】:

  • 太好了。使用 async/await 的版本看起来如何?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2023-03-22
  • 1970-01-01
  • 2014-03-18
  • 2014-09-06
相关资源
最近更新 更多