【发布时间】: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调用您的方法时也不会发生这种情况,因为asyncis not about threads。 -
aync/await是该方法的实现细节。唯一重要的是它返回一个任务。如果您需要返回任务但没有异步源,请使用Task.FromResult -
您的代码将是同步的并且会阻塞。如果您不希望这种情况发生,请使用
Task.Run。 -
如果您的方法本质上是同步的,请将其保留为同步方法,并由您的调用者决定是直接调用还是使用例如
Task.Run。正如其他人所说(以及编译器警告所说,如果您尝试这样做),async本身从调用者的角度来看没有做任何事情。 -
异步是关于缩放,而不是多处理。异步方法在等待某些 IO 绑定任务时生成代码以放弃其线程(因此该线程可用于处理其他请求)。然后,当 IO 完成时,它会继续。
标签: c# asynchronous async-await task-parallel-library