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

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)

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

ast*_*tef 5

通常,这就是您等待所有任务异步完成的方式(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 。

  • 您用完了一个线程,这是一种宝贵的资源,由Ram和CPU时间组成,并且需要上下文切换。除非您实际上受CPU约束,否则单线程可能会更有效率。 (2认同)

Eni*_*ity 5

您需要这样做:

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)