关于任务,异步和等待的多线程

我有下面的代码,只是想确保我有一个高层次的多线程的概念。

public async Task<List<Category>> GetProjectsByCategoryIDAsync(Int16 categoryid)
    {
        try
        {
            using (YeagerTechEntities DbContext = new YeagerTechEntities())
            {
                DbContext.Configuration.ProxyCreationEnabled = false;
                DbContext.Database.Connection.Open();

                var category = await DbContext.Categories.Include("Projects").Where(p => p.CategoryID == categoryid).ToListAsync();

                return category;
            }
        }
        catch (Exception)
        {
            throw;
        }
    }

这是我对以下内容的理解:

  • 异步 - 声明一个方法异步运行而不是同步运行。
  • 任务 - 声明一个方法在单个线程上作为任务运行
  • 等待 - 任务等待操作完成。
  • 我在哪里关于await关键字有点模糊。 显然,异步编程的好处在于,在另一个请求进入之前,该方法可能不需要等待任务完成。 但是,使用await关键字,任务会等到操作完成。

    通过同步编程,所有内容都以顺序模式处理。

    这种方法如何允许请求同时进入并以比同步编程更快的方式执行?

    我只是需要高层次的解释才能理解这个概念。

    非常感谢提前。


    考虑下面的代码:

        public async Task DoSomething()
        {
            Console.WriteLine("Begin");
            int i = await DoSomethingElse();
            Console.WriteLine("End " + i);
        }
    
        public Task<int> DoSomethingElse()
        {
            return new Task<int>(() =>
            {
                // do heavy work
                Thread.Sleep(1000);
                return 1;
            });
    
        }
    

    通过同步编程,所有内容都以顺序模式处理。

    上面的代码是异步的,但仍然是顺序的。 该代码与其同步版本(例如public int DoSomethingElse )之间的区别在于,当您await DoSomethingElse ,主线程将被释放以执行其他工作,而不是阻止等待DoSomethingElse完成。

    实际发生的情况是:您的异步DoSomething方法将在线程A上运行并被分解为两部分。

  • 第一部分将打印“开始”并进行异步调用,然后返回
  • 第二部分将打印“结束”
  • 在该方法的第一部分执行后,线程A将可以自由地执行其他工作。 与此同时,线程B将执行做一些繁重工作的lambda表达式。 只要线程B完成,方法的第二部分将计划在线程A上运行,并且将打印“结束”。

    请注意,虽然线程B正在执行繁重的工作,但线程A可以自由地执行其他任务。

    这种方法如何允许请求同时进入并以比同步编程更快的方式执行?

    在诸如ASP.NET MVC之类的框架中,您的应用程序具有可用于处理传入请求的有限数量的线程(让我们调用这些“请求线程”)。 通过将繁重的工作委托给其他线程并等待,您的请求线程将可以自由地处理更多传入请求,同时完成繁重的工作。

    这个图虽然很复杂,但却说明了执行异步工作的线程的执行/挂起流程:

    在这里输入图像描述

    请注意,在步骤6中,线程是如何生成的,然后步骤7重新开始执行该方法。 正如你所看到的, await关键字有效地将方法分成两部分。

    链接地址: http://www.djcxy.com/p/79315.html

    上一篇: multithreading in regards toTask, async, and await

    下一篇: async/await for high performance server applications?