Lux*_*ior 1 .net c# asynchronous async-await
我需要执行一些需要异步的操作(例如,向数据库中写入内容,并同时从中读取内容,反序列化我从数据库中读取的内容,对那些数据进行处理...等),但是我需要要么在线程上执行,要么在任务上执行,这样我就可以在执行过程中做其他事情。
而且,如果有可能喜欢,总是总是一方面读取数据库,而另一方面则在其中写入数据,那将是非常不错的,我很确定这是可能的,但是我不确定如何实现它,以及什么库/工具/函数...等等
我正在开发控制台应用程序
我尝试了一些类似异步方法的尝试,但是我并不太了解所有命令之间的执行顺序,问题还在于我不太了解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;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是一个示例,其中可能有错误,但是我的代码的功能在那里
通常,这就是您等待所有任务异步完成的方式(docs):
await Task.WhenAll(myArrayOfTasks);
Run Code Online (Sandbox Code Playgroud)
并在内部等待Task.Run传递异步委托(有些已读):
Task.Run(async () =>
{
await Task.Delay(1000);
});
Run Code Online (Sandbox Code Playgroud)
此外,阅读有关在实践中为什么要避免的原因也很有帮助Task.Run:Task.Run礼节和正确用法以及更多示例。简而言之,您不应使用来包装阻塞APITask.Run,因为没有意义,因为底层线程仍会被阻塞。非阻塞API的一个很好的设计是return Task,因此您无论如何都不需要运行新的API 。
您需要这样做:
static async Task Main(string[] args)
{
var tasks = new[]
{
Task.Run(() =>
{
// Need to be awaited
var writer = WritingDatabase();
}),
Task.Run(() =>
{
// Need to be awaited as well
var reader = ReadingDatabase();
})
};
await Task.WhenAll(tasks);
}
Run Code Online (Sandbox Code Playgroud)