c# - 如何在线程或任务中进行异步操作
问题描述
我需要做一些需要异步的操作(比如向数据库写入一些东西,同时从中读取一些东西,反序列化我从中读取的内容,对这些数据做一些事情......等等)但我需要要么在线程上执行,要么在任务上执行,这样我就可以在所有执行过程中做其他事情。
此外,如果可以喜欢,总是一方面读取数据库,另一方面在其中写入数据,那就太好了,我很确定这是可能的,但我不确定如何实现它,以及使用什么库/工具/功能...等
我正在开发控制台应用程序
我尝试了一些东西,比如只是带有一些等待的异步方法,但我并不真正了解所有这些之间的执行顺序,问题还在于我不太了解async
/await
关键字以及如何Task
工作,但我尝试了少量。
我正在处理的实际上是 2 Task.Run
,一个在数据库中写入数据的方法,另一个Task.Run
在读取数据库的方法中,问题是在这两种方法中,我都有函数,async
然后,它们需要等待某处,因此也需要等待对写入数据或读取数据的调用,但我不知道如何进行Task.Run
async
static async Task Main(string[]args)
{
// Those two tasks need to run at the same time
Task.Run(() =>
{
// Need to be awaited
var writer = WritingDatabase();
}
Task.Run(() =>
{
// Need to be awaited as well
var reader = ReadingDatabase();
}
}
public async Task<List<Code>> ReadingDatabase()
{
List<Code> listCode = new List<Code>();
// Some code
listCode.Add(await database.ReceiveMessageAsync());
return listCode;
}
上面的代码是一个示例,其中可能存在一些错误,但我的代码的功能在那里
解决方案
通常这就是您等待所有任务异步完成的方式(文档):
await Task.WhenAll(myArrayOfTasks);
并在内部等待Task.Run
只是传递异步委托(一些读取):
Task.Run(async () =>
{
await Task.Delay(1000);
});
此外,了解您在实践中要避免的原因也很有帮助Task.Run
:Task.Run Etiquette 和 Proper Usage以及更多示例。简而言之,你不应该用 包装阻塞 APITask.Run
,这是没有意义的,因为无论如何底层线程都会被阻塞。非阻塞 API 的一个好的设计是 return Task
,所以无论如何你都不需要运行一个新的。
推荐阅读
- elasticsearch - 根据响应值计算 Prometheus 中的可用性
- javascript - 使用 Javascript 实现自动化
- ios - 动画子视图 AutoLayout 约束更改
- loops - 获取一个循环以显示从 2048 到 1 的 2 的所有幂,显示 2048、1024、512、...、1
- node.js - Node.js 中的同步 api 调用
- powershell - “-split” - 从“-stream”输出?
- glassfish-4 - 启动 GlassFish 4.0 时无法找到或加载主类 Files.Microsoft
- oracle - 计算两个字段之间的日期
- mysql - 在 MySQL 中转换日期
- android - 我可以根据我的应用主题为我的应用中的所有 AppBarLayout 设置样式吗?