【问题标题】:c# Writing an async method that doesn't have an await in itc# 编写一个没有等待的异步方法
【发布时间】:2019-01-03 12:42:22
【问题描述】:

我想在我的调用中有一个async 方法,该方法将由我的库使用者使用await 调用。但是我的方法的内部工作,虽然我需要它在单独的线程上运行,但它自己不会调用任何其他 await

我只是做该方法应该做的工作并返回类型。并且编译器警告我这个方法不会以异步方式运行。

public async Task<MyResultObject> DoSomeWork()
{
     MyResultObject result = new MyResultObject();
     // Some work to be done here

     return result;
}

另一方面,如果我编写一个使用 TaskFactory 启动新任务的方法,如下所示:

public Task<MyResultObject> DoSomeWork()
{
     return Task<MyResultObject>.Factory.StartNew(() =>
     {
         MyResultObject result = new MyResultObject();
         // Some work to be done here

         return result;
     });
}

那我不能像await DoSomeWork()这样使用await关键字来调用它。

如何在不使用 await 内部调用的情况下编写 async(必须是异步的,而不是带有结果或等待的任务)?

【问题讨论】:

  • while I need it to run on a separate thread - 如果您没有在方法中自己实现这一点,例如使用Task.Run(),那么当使用await 调用您的方法时也不会发生这种情况,因为async is not about threads
  • aync/await 是该方法的实现细节。唯一重要的是它返回一个任务。如果您需要返回任务但没有异步源,请使用Task.FromResult
  • 您的代码将是同步的并且会阻塞。如果您不希望这种情况发生,请使用Task.Run
  • 如果您的方法本质上是同步的,请将其保留为同步方法,并由您的调用者决定是直接调用还是使用例如Task.Run。正如其他人所说(以及编译器警告所说,如果您尝试这样做),async 本身从调用者的角度来看没有做任何事情
  • 异步是关于缩放,而不是多处理。异步方法在等待某些 IO 绑定任务时生成代码以放弃其线程(因此该线程可用于处理其他请求)。然后,当 IO 完成时,它会继续。

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


【解决方案1】:

你可以这样做

public Task<MyResultObject> DoSomeWork()
{
     MyResultObject result = new MyResultObject();
     // Some work to be done here

     return Task.FromResult(result);
}

完全一样
public async Task<MyResultObject> DoSomeWork()
{
     MyResultObject result = new MyResultObject();
     // Some work to be done here

     return result;
}

只有这个版本会发出警告,并且开销稍大。

但两者都不会在另一个线程上运行。唯一的好处是它们有一个可等待的接口。

要并行执行,您的代码还可以,但 Task.Run 优于 StartNew():

public Task<MyResultObject> DoSomeWork()
{
     return Task.Run(() =>
     {
         MyResultObject result = new MyResultObject();
         // Some work to be done here

         return result;
     });
}

在所有这些情况下,你绝对可以await DoSomeWork()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多