关于任务,异步和等待的多线程
我有下面的代码,只是想确保我有一个高层次的多线程的概念。
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
关键字有效地将方法分成两部分。