如何在线程或任务中进行异步操作

我需要做一些需要异步的操作(比如向数据库写入一些内容,同时从中读取一些内容,反序列化我从中读取的内容,对这些数据执行某些操作...等等),但我需要要么在线程上执行此操作,要么在任务上执行此操作,以便我可以在执行期间执行其他操作。


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


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


我尝试了一些东西,例如带有一些等待的异步方法,但我不太了解所有这些之间的执行顺序,问题还在于我不太了解 / 关键字以及如何工作,但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;

}


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


冉冉说
浏览 113回答 3
3回答

12345678_0001

通常这就是等待所有任务异步完成的方式:await Task.WhenAll(myArrayOfTasks);要在内部等待,Task.Run只需传递异步委托(一些读取):Task.Run(async () => {    await Task.Delay(1000); });另外,了解为什么在实践中要避免Task.Run:Task.Run Etiquette 和正确用法以及更多示例也会很有帮助。简而言之,您不应该用 包装阻塞 APITask.Run,这是没有意义的,因为底层线程无论如何都会被阻塞。对于非阻塞 API 来说,一个好的设计是 return Task,因此您无论如何都不需要运行新的 API。

拉风的咖菲猫

你需要这样做:static async Task Main(string[] args){&nbsp; &nbsp; var tasks = new[]&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Task.Run(() =>&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Need to be awaited&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var writer = WritingDatabase();&nbsp; &nbsp; &nbsp; &nbsp; }),&nbsp; &nbsp; &nbsp; &nbsp; Task.Run(() =>&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Need to be awaited as well&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var reader = ReadingDatabase();&nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; };&nbsp; &nbsp; await Task.WhenAll(tasks);}

侃侃无极

由于您已经拥有Task返回 API,因此您可以执行以下操作:static async Task Main(string[]args){&nbsp; &nbsp; await Task.WhenAll(WritingDatabase, ReadingDatabase);}
打开App,查看更多内容
随时随地看视频慕课网APP