如何在。网络核心项目中实现并发编程

  介绍

今天就跟大家聊聊有关如何在。网络核心项目中实现并发编程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强>并发编程——异步与多线程代码

并行编程是一个广泛的术语,我们应该通过观察异步方法和实际的多线程之间的差异展开探讨。尽管。NET核心使用了任务来表达同样的概念,一个关键的差异是内部处理的不同。调用线程在做其他事情时,异步方法在后台运行。这意味着这些方法是I/O密集型的,即他们大部分时间用于输入和输出操作,例如文件或网络访问。只要有可能,使用异步I/O方法代替同步操作很有意义。相同的时间,调用线程可以在处理桌面应用程序中的用户交互或处理服务器应用程序中的同时处理其他请求,而不仅仅是等待操作完成。

计算密集型的方法要求CPU周期工作,并且只能运行在他们专用的后台线程中.CPU的核心数限制了并行运行时的可用线程数量。操作系统负责在剩余的线程之间切换,使他们有机会执行代码。这些方法仍然被并发地执行,却不必被并行地执行。尽管这意味着方法不是同时执行,却可以在其他方法暂停的时候执行。

如何在。网络核心项目中实现并发编程

并行vs并发

本文将在最后一段中重点介绍在。NET核心中多线程并发编程。

<强>任务并行库

。净框架4引入了任务并行库(TPL)作为编写并发代码的首选API . .网络核心采用相同的编程模式。要在后台运行一段代码,需要将其包装成一个任务:

var  backgroundTask =, Task.Run((),=祝辞,DoComplexCalculation (42));//,do  other 工作   var  result =, backgroundTask.Result;

当需要返回结果时,任务。运行方法接收一个函数(函数);当不需要返回结果时,方法的任务。运行接收一个动作(行动)。当然,所有的情况下都可以使用λ表达式,就像我上面例子中调用带一个参数的长时间方法。线程池中的某个线程将会处理任务。网络核心的运行时包含一个默认调度程序,使用线程池来处理队列并执行任务。您可以通过派生TaskScheduler类实现自己的调度算法,代替默认的,但这超过本文的讨论范围。正如我们之前所见,我使用结果属性来合并被调用的后台线程。对于不需要返回结果的线程,我可以调用等()来代替。这两种方式都将被堵塞到后台任务完成。为了避免堵塞调用线程(如在ASP。网络核心应用程序中),可以使用等待关键字:

var  backgroundTask =, Task.Run((),=祝辞,DoComplexCalculation (42));//,do  other 工作   var  result =, await  backgroundTask;

这样被调用的线程将被释放以便处理其他传入请求。一旦任务完成,一个可用的工作线程将会继续处理请求。当然,控制器动作方法必须是异步的:

public  async  Task,指数(),{,//method  body }

<强>处理异常

将两个线程合并在一起的时候,任务抛出的任何异常将被传递到调用线程中:

如果使用结果或等待(),它们将被打包到AggregateException中。实际的异常将被抛出并存储在其InnerException属性中。

如果您使用等待,原来的异常将不会被打包。

在这两种情况下,调用堆栈的信息将保持不变。

<>强取消任务

由于任务是可以长时间运行的,所以你可能想要有一个可以提前取消任务的选项。实现这个选项,需要在任务创建的时候传入取消的令牌(令牌),之后再使用令牌触发取消任务:

var  tokenSource =, new 时候触发();   var  cancellableTask =, Task.Run((),=比;   {   for  (int 小姐:=,0;,小姐:& lt;, 100;,我+ +)   {   if  (tokenSource.Token.IsCancellationRequested)   {//,clean  up  before 退出   tokenSource.Token.ThrowIfCancellationRequested ();   }//,do  long-running 处理   }   return  42;   },,tokenSource.Token);//cancel 从而任务   tokenSource.Cancel ();   试一试   {   await  cancellableTask;   }   catch  (OperationCanceledException  e)   {//,handle 从而;例外   }

实际上,为了提前取消任务,你需要检查任务中的取消令牌,并在需要取消的时候作出反应:在执行必要的清理操作后,调用

如何在。网络核心项目中实现并发编程