关于Task,async和await的多线程

sagesky36

我有以下代码,并且只是想确保我拥有高层次的多线程概念。

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;
        }
    }

我对以下内容的理解:

  1. 异步-声明一个异步运行而不是同步运行的方法。
  2. 任务-声明一个方法以在单个线程上作为任务运行
  3. 等待-任务等待操作完成。

我有些不解的地方是await关键字。显然,异步编程的好处在于,该方法据说不必等待任务完成,而无需等待另一个请求。但是使用await关键字,任务将等待直到操作完成。

通过同步编程,所有内容均按顺序模式进行处理。

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

我只需要高层次的解释就可以理解这个概念。

非常感谢。

dcastro

考虑以下代码:

    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上运行并分成两部分。

  • 第一部分将打印“ Begin”并进行异步调用,然后返回
  • 第二部分将显示“结束”

在方法的第一部分执行之后,线程A将可以自由地执行其他工作。同时,线程B将执行做一些繁重工作的lambda表达式。每当线程B完成时,方法的第二部分将安排在线程A上运行,并且将显示“ End”。

注意,当线程B执行繁重的工作时,线程A可以自由地做其他事情。

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

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

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

在此处输入图片说明

注意在步骤6如何产生线程,然后在步骤7恢复该方法的执行。如您所见,await关键字有效地将方法分为两部分。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章