首页 > 解决方案 > 如何在线程或任务中进行异步操作

问题描述

我需要做一些需要异步的操作(比如向数据库写入一些东西,同时从中读取一些东西,反序列化我从中读取的内容,对这些数据做一些事情......等等)但我需要要么在线程上执行,要么在任务上执行,这样我就可以在所有执行过程中做其他事情。

此外,如果可以喜欢,总是一方面读取数据库,另一方面在其中写入数据,那就太好了,我很确定这是可能的,但我不确定如何实现它,以及使用什么库/工具/功能...等

我正在开发控制台应用程序

我尝试了一些东西,比如只是带有一些等待的异步方法,但我并不真正了解所有这些之间的执行顺序,问题还在于我不太了解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;
}

上面的代码是一个示例,其中可能存在一些错误,但我的代码的功能在那里

标签: c#.netasynchronousasync-await

解决方案


通常这就是您等待所有任务异步完成的方式(文档):

await Task.WhenAll(myArrayOfTasks);

并在内部等待Task.Run只是传递异步委托(一些读取):

Task.Run(async () =>
{
    await Task.Delay(1000);
});

此外,了解您在实践中要避免的原因也很有帮助Task.RunTask.Run Etiquette 和 Proper Usage以及更多示例。简而言之,你不应该用 包装阻塞 APITask.Run,这是没有意义的,因为无论如何底层线程都会被阻塞。非阻塞 API 的一个好的设计是 return Task,所以无论如何你都不需要运行一个新的。


推荐阅读