c# - c# 编写一个没有等待的异步方法
问题描述
我想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
关键字来调用它await DoSomeWork()
。
如何在async
不使用内部调用的情况下编写(必须是异步的,而不是带有结果或等待的任务)await
?
解决方案
你可以这样做
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()
推荐阅读
- javascript - 不要同时运行两个计时器
- ruby-on-rails - 在生产环境中使用 Capistrano 的 Rails 多环境凭据:如何设置?
- python - 如何在 keras 中生成可变大小的距离矩阵?
- c# - CustomUI Ribbon.xml onLoad 事件仅在启动时触发一次
- spring - 如何获取分页的总页码
- java - 在eclipse中用maven构建不会将本地jar的内容包含到可执行jar中
- c - 将字符串一分为二并分配给两个 char 数组
- java - 无法从所有分区中获取 Kafka 滞后
- nginx - 将带数字的字母放在lua变量中
- bootstrap-4 - 在 TempusDominus bootstrap4 datetimepicker 中禁用未来日期