网站设计电脑培训学校wordpress导航菜单下拉

news/2025/9/23 11:33:18/文章来源:
网站设计电脑培训学校,wordpress导航菜单下拉,网站建设-丹东,wordpress 免费 主题 下载原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 CPU#xff0c;允许它并行执行多个指令。操作系统通过将进程调度到不同的内核来发挥这个结构的优点。然而#xff0c;还可以通过异步 I/O 操作…原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 CPU允许它并行执行多个指令。操作系统通过将进程调度到不同的内核来发挥这个结构的优点。然而还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序的性能。在.NET Core中任务 (tasks) 是并发编程的主要抽象表述但还有其他支撑类可以使我们的工作更容易。 并发编程 - 异步 vs. 多线程代码 并行编程是一个广泛的术语我们应该通过观察异步方法和实际的多线程之间的差异展开探讨。尽管 .NET Core 使用了任务来表达同样的概念一个关键的差异是内部处理的不同。调用线程在做其他事情时异步方法在后台运行。这意味着这些方法是 I/O 密集型的即他们大部分时间用于输入和输出操作例如文件或网络访问。只要有可能使用异步 I/O 方法代替同步操作很有意义。相同的时间调用线程可以在处理桌面应用程序中的用户交互或处理服务器应用程序中的同时处理其他请求而不仅仅是等待操作完成。 你可以在我的文章 Asynchronous Programming in C# using Async Await – Best Practices 中关于使用 async 和 await 调用异步方法。该文章来自 DNC Magazine (9月刊) 。 计算密集型的方法要求 CPU 周期工作并且只能运行在他们专用的后台线程中。CPU 的核心数限制了并行运行时的可用线程数量。操作系统负责在剩余的线程之间切换使他们有机会执行代码。这些方法仍然被并发地执行却不必被并行地执行。尽管这意味着方法不是同时执行却可以在其他方法暂停的时候执行。 并行 vs 并发 本文将在最后一段中重点介绍 在 .NET Core中多线程并发编程。 任务并行库 .NET Framework 4 引入了任务并行库 (TPL) 作为编写并发代码的首选 API。.NET Core采用相同的编程模式。要在后台运行一段代码需要将其包装成一个 任务 var backgroundTask Task.Run(() DoComplexCalculation(42)); // do other work var result backgroundTask.Result; 当需要返回结果时Task.Run 方法接收一个 函数 (Func) 当不需要返回结果时方法 Task.Run 接收一个 动作 (Action) 。当然所有的情况下都可以使用 lambda 表达式就像我上面例子中调用带一个参数的长时间方法。线程池中的某个线程将会处理任务。.NET Core 的运行时包含一个默认调度程序使用线程池来处理队列并执行任务。您可以通过派生 TaskScheduler 类实现自己的调度算法代替默认的但这超过本文的讨论范围。正如我们之前所见我使用 Result 属性来合并被调用的后台线程。对于不需要返回结果的线程我可以调用 Wait() 来代替。这两种方式都将被堵塞到后台任务完成。为了避免堵塞调用线程 ( 如在ASP.NET Core应用程序中) 可以使用 await 关键字 var backgroundTask Task.Run(() DoComplexCalculation(42)); // do other work var result await backgroundTask; 这样被调用的线程将被释放以便处理其他传入请求。一旦任务完成一个可用的工作线程将会继续处理请求。当然控制器动作方法必须是异步的: public async Taskiactionresult Index() {     // method body } 处理异常 将两个线程合并在一起的时候任务抛出的任何异常将被传递到调用线程中 如果使用 Result 或 Wait() 它们将被打包到 AggregateException 中。实际的异常将被抛出并存储在其 InnerException 属性中。如果您使用 await原来的异常将不会被打包。 在这两种情况下调用堆栈的信息将保持不变。 取消任务 由于任务是可以长时间运行的所以你可能想要有一个可以提前取消任务的选项。实现这个选项需要在任务创建的时候传入取消的令牌 (token)之后再使用令牌触发取消任务 var tokenSource new CancellationTokenSource(); var cancellableTask Task.Run(() {      for ( int i 0; i 100; i)      {          if (tokenSource.Token.IsCancellationRequested)          {              // clean up before exiting              tokenSource.Token.ThrowIfCancellationRequested();          }          // do long-running processing      }      return 42; }, tokenSource.Token); // cancel the task tokenSource.Cancel(); try {      await cancellableTask; } catch (OperationCanceledException e) {      // handle the exception }  实际上为了提前取消任务你需要检查任务中的取消令牌并在需要取消的时候作出反应:在执行必要的清理操作后调用 ThrowIfCancellationRequested() 退出任务。这个方法将会抛出 OperationCanceledException以便在调用线程中执行相应的处理。 协调多任务 如果你需要运行多个后台任务这里有些方法可以帮助到你。要同时运行多个任务只需连续启动它们并收集它们的引用例如在数组中 var backgroundTasks new [] {      Task.Run(() DoComplexCalculation(1)),      Task.Run(() DoComplexCalculation(2)),      Task.Run(() DoComplexCalculation(3)) }; 现在你可以使用 Task 类的静态方法等待他们被异步或者同步执行完毕。 // wait synchronously Task.WaitAny(backgroundTasks); Task.WaitAll(backgroundTasks); // wait asynchronously await Task.WhenAny(backgroundTasks); await Task.WhenAll(backgroundTasks); 实际上这两个方法最终都会返回所有任务的自身可以像任何其他任务一样再次操作。为了获取对应任务的结果你可以检查该任务的 Result 属性。处理多任务的异常有点棘手。方法 WaitAll 和 WhenAll 不管哪个任务被收集到异常时都会抛出异常。不过对于 WaitAll 将会收集所有的异常到对应的 InnerExceptions 属性对于 WhenAll 只会抛出第一个异常。为了确认哪个任务抛出了哪个异常您需要单独检查每个任务的 Status 和 Exception 属性。在使用 WaitAny 和 WhenAny 时必须足够小心。他们会等到第一个任务完成 (成功或失败)即使某个任务出现异常时也不会抛出任何异常。他们只会返回已完成任务的索引或者分别返回已完成的任务。你必须等到任务完成或访问其 result 属性时捕获异常例如 var completedTask await Task.WhenAny(backgroundTasks); try {      var result await completedTask; } catch (Exception e) {      // handle exception } 如果你想连续运行多个任务代替并发任务可以使用延续 (continuations)的方式 var compositeTask Task.Run(() DoComplexCalculation(42))      .ContinueWith(previous DoAnotherComplexCalculation(previous.Result),          TaskContinuationOptions.OnlyOnRanToCompletion) ContinueWith() 方法允许你把多个任务一个接着一个执行。这个延续的任务将获取到前面任务的结果或状态的引用。 你仍然可以增加条件判断是否执行延续任务例如只有在前面任务成功执行或者抛出异常时。对比连续等待多个任务提高了灵活性。当然您可以将延续任务与之前讨论的所有功能相结合异常处理、取消和并行运行任务。这就有了很大的表演空间以不同的方式进行组合 var multipleTasks new [] {      Task.Run(() DoComplexCalculation(1)),      Task.Run(() DoComplexCalculation(2)),      Task.Run(() DoComplexCalculation(3)) }; var combinedTask Task.WhenAll(multipleTasks); var successfulContinuation combinedTask.ContinueWith(task          CombineResults(task.Result), TaskContinuationOptions.OnlyOnRanToCompletion); var failedContinuation combinedTask.ContinueWith(task          HandleError(task.Exception), TaskContinuationOptions.NotOnRanToCompletion); await Task.WhenAny(successfulContinuation, failedContinuation); 任务同步 如果任务是完全独立的那么我们刚才看到的协调方法就已足够。然而一旦需要同时共享数据为了防止数据损坏就必须要有额外的同步。两个以及更多的线程同时更新一个数据结构时数据很快就会变得不一致。就好像下面这个示例代码一样 var counters new Dictionary int , int (); if (counters.ContainsKey(key)) {      counters[key] ; } else {      counters[key] 1; } 当多个线程同时执行上述代码时不同线程中的特定顺序执行指令可能导致数据不正确例如 所有线程将会检查集合中是否存在同一个 key结果他们都会进入 else 分支并将这个 key 的值设为1最后结果将会是1而不是2。如果是接连着执行代码的话将会是预期的结果。 上述代码中临界区 (critical section) 一次只允许一个线程可以进入。在C# 中可以使用 lock 语句来实现: var counters new Dictionary int , int (); lock (syncObject) {      if (counters.ContainsKey(key))      {          counters[key];      }      else      {          counters[key] 1;      } } 在这个方法中所有线程都必须共享相同的的 syncObject 。作为最佳做法syncObject 应该是一个专用的 Object 实例专门用于保护对一个独立的临界区的访问避免从外部访问。在 lock 语句中只允许一个线程访问里面的代码块。它将阻止下一个尝试访问它的线程直到前一个线程退出。这将确保线程完整执行临界区代码而不会被另一个线程中断。当然这将减少并行性并减慢代码的整体执行速度因此您最好最小化临界区的数量并使其尽可能的短。 使用 Monitor 类来简化 lock 声明 var lockWasTaken false ; var temp syncObject; try {      Monitor.Enter(temp, ref lockWasTaken);      // lock statement body } finally {      if (lockWasTaken)      {          Monitor.Exit(temp);      } } 尽管大部分时间您都希望使用 lock 语句但 Monitor 类可以在需要时给予额外的控制。例如您可以使用 TryEnter() 而不是 Enter()并指定一个限定时间避免无止境地等待锁释放。 其他同步基元 Monitor 只是 .NET Core 中众多同步基元的一员。根据实际情况其他基元可能更适合。 Mutex 是 Monitor 更重量级的版本依赖于底层的操作系统提供跨多个进程同步访问资源[1] 是针对 Mutex 进行同步的推荐替代方案。 SemaphoreSlim 和 Semaphore 可以限制同时访问资源的最大线程数量而不是像 Monitor 一样只能限制一个线程。 SemaphoreSlim 比 Semaphore 更轻量但仅限于单个进程。如果可能您最好使用 SemaphoreSlim 而不是 Semaphore。 ReaderWriterLockSlim 可以区分两种对访问资源的方式。它允许无限数量的读取器 (readers) 同时访问资源并且限制同时只允许一个写入器 (writers) 访问锁定资源。读取时线程安全但修改数据时需要独占资源很好地保护了资源。 AutoResetEvent、ManualResetEvent 和 ManualResetEventSlim 将堵塞传入的线程直到它们接收到一个信号 (即调用 Set() )。然后等待中的线程将继续执行。AutoResetEvent 在下一次调用 Set() 之前将一直阻塞并只允许一个线程继续执行。ManualResetEvent 和 ManualResetEventSlim 不会堵塞线程除非 Reset() 被调用。ManualResetEventSlim 比前两者更轻量更值得推荐。 Interlocked 提供一种选择——原子操作这是替代 locking 和其他同步基元更好的选择如果适用 // non-atomic operation with a lock lock (syncObject) {      counter; } // equivalent atomic operation that doesnt require a lock Interlocked.Increment( ref counter); 并发集合 当一个临界区需要确保对数据结构的原子访问时用于并发访问的专用数据结构可能是更好和更有效的替代方案。例如使用 ConcurrentDictionary 而不是 Dictionary可以简化 lock 语句示例 var counters new ConcurrentDictionary int , int (); counters.TryAdd(key, 0); lock (syncObject) {      counters[key]; } 自然地也有可能像下面一样: counters.AddOrUpdate(key, 1, (oldKey, oldValue) oldValue 1); 因为 update 的委托是临界区外面的方法因此第二个线程可能在第一个线程更新值之前读取到同样的旧值使用自己的值有效地覆盖了第一个线程的更新值这就丢失了一个增量。错误使用并发集合也是无法避免多线程带来的问题。并发集合的另一个替代方案是 不变的集合 (immutable collections)。类似于并发集合同样是线程安全的但是底层实现是不一样的。任何关改变数据结构的操作将不会改变原来的实例。相反它们返回一个更改后的副本并保持原始实例不变 var original new Dictionary int , int ().ToImmutableDictionary(); var modified original.Add(key, value); 因此在一个线程中对集合任何更改对于其他线程来说都是不可见的。因为它们仍然引用原来的未修改的集合这就是不变的集合本质上是线程安全的原因。当然这使得它们对于解决不同集合的问题很有效。最好的情况是多个线程在同一个输入集合的情况下独立地修改数据在最后一步可能为所有线程合并变更。而使用常规集合需要提前为每个线程创建集合的副本。 并行LINQ (PLINQ) 并行LINQ (PLINQ) 是 Task Parallel Library 的替代方案。顾名思义它很大程度上依赖于 LINQ语言集成查询功能。对于在大集合中执行相同的昂贵操作的场景是很有用的。与所有操作都是顺序执行的普通 LINQ to Objects 不同的是PLINQ可以在多个CPU上并行执行这些操作。发挥优势所需要的代码改动也是极小的: // sequential execution var sequential Enumerable.Range(0, 40)      .Select(n ExpensiveOperation(n))      .ToArray(); // parallel execution var parallel Enumerable.Range(0, 40)      .AsParallel()      .Select(n ExpensiveOperation(n))      .ToArray(); 如你所见这两个代码片段的不同仅仅是调用 AsParallel()。这将IEnumerable 转换为 ParallelQuery导致查询的部分并行运行。要切换为回顺序执行您可以调用 AsSequential()它将再次返回一个IEnumerable。默认情况下PLINQ 不保留集合中的顺序以便让进程更有效率。但是当顺序很重要时可以调用 AsOrdered(): var parallel Enumerable.Range(0, 40)      .AsParallel()      .AsOrdered()      .Select(n ExpensiveOperation(n))      .ToArray(); 同理你可以通过调用 AsUnordered() 切换回来。 在完整的 .NET Framework 中并发编程 由于 .NET Core 是完整的 .NET Framework 的简化实现所以 .NET Framework 中所有并行编程方法也可以在.NET Core 中使用。唯一的例外是不变的集合它们不是完整的 .NET Framework 的组成部分。它们作为单独的 NuGet 软件包(System.Collections.Immutable)分发您需要在项目中安装使用。 结论 每当应用程序包含可以并行运行的 CPU 密集型代码时利用并发编程来提高性能并提高硬件利用率是很有意义的。.NET Core 中的 API 抽象了许多细节使编写并发代码更容易。然而需要注意某些潜在的问题 其中大部分涉及从多个线程访问共享数据。如果可以的话你应该完全避免这种情况。如果不行请确保选择最合适的同步方法或数据结构。 原文地址http://www.cnblogs.com/chenug/p/6746149.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1874(CF Round 901) 总结

CF1874(CF Round 901) 总结 A 显然若干轮之后,每两次操作不会改变它们的苹果,于是让 \(K\) 对一个较小数取 \(\min\) 然后暴力做即可。 B 每一位是独立的,对于 \(a,b,m\) 都相同的位,操作后的结果一定相同,所以只…

南通网站建设南通怎么修改网站后台权限

服务器安装IIS: 微软官网下载SDK: 下载Runtime官网:https://dotnet.microsoft.com/download/dotnet-core 安装成功重启IIS: VS发布项目:

ps个人网站建设英文网站建设的问题

随着ChatGPT引领的AI破圈,各行各业掀起了AI落地的潮流,从智能客服、智能写作、智能监控,到智能医疗、智能家居、智能金融、智能农业,谁能快速将AI与传统业务相结合,谁就将成为企业数字化和智能化变革的优胜者。然而&am…

国内购物网站哪个最好网络广告策划方案怎么做

前两天有一个学html5前端小美女问我一个有关文字阴影的效果怎么去实现。她和我说文字阴影嘛,她也知道text-shadow,.但是却做不出想要的样子,其实css3的新功能是很强大的,不要把你的思想太过于局限化,好了,闲话也不多说,咱们就先来看看这个文本阴影. 一.文字阴影text-shadow 文…

wordpress知更鸟more排名好的网站关键词优化企业

Dataload介绍 DataLoad是一个针对Oracle开发的数据录入工具(也适用其他程序),其工作原理是模仿键盘的操作,将数据和键盘的按键以表格的形式存储起来。当你需要在目标程序界面中输入数据的时候,dataload根据所定义的数据和键盘按键顺序,将数据录入。 Dataload常用命令 Da…

好网站的特点网站模板制作与安装教程

2023-12-03每日一题 一、题目编号 1423. 可获得的最大点数二、题目链接 点击跳转到题目位置 三、题目描述 几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动,你可以从行的开头或者末尾拿一张卡牌&#x…

网站开发流程表微网站建设公司

2020 MATLAB EXPO 中国线上用户大会一切转型始于数据和模型2020 年 7 月 21-24 日 | 线上直播MATLAB 和 Simulink,作为业界普遍使用的科学计算与模型仿真软件,已被全球的工程师和科学家们广泛应用于加快汽车、航空、电子、金融服务、生物医药以及其他行业…

长沙手机网站设计郴州旅游

楔子四年前我虽然也写了很多年代码,由于公司虽然规模不小,却并非一家规范化的软件公司,因此在项目中严格意义上来说并没有架构设计、也不写单元测试,后来有幸加入了一家公司,这家公司虽然也是一家小公司,但…

9.23 资料分析 7/10

9.23 资料分析 7/101.转换问题 转换为混合增长率技巧 思路问题

2. Spring AI 快速入门使用 - Rainbow

2. Spring AI 快速入门使用 @目录2. Spring AI 快速入门使用快速使用接入deepseek流式对话options配置选项temperature(温度)建议maxTokens stop模型推理原理:接入阿里百炼使用文生图文生语音text2audio语音翻译aud…

PyCharm 2025.1安装包下载与安装教程

软件介绍 PyCharm 2025.1 是 JetBrains 推出的革命性 Python 集成开发环境,采用统一版本架构整合了专业版与社区版功能。核心功能如 Jupyter Notebook 支持、基础代码编辑、调试器及版本控制完全免费开放,同时推出 P…

阿里将发布多模态模型 Qwen3-Omni,主打多语言与复杂推理;DeepvBrowser 上线 AI 语音浏览器丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、…

Word文档内容批量替换脚本 - wanghongwei

word_replace_v1.py # -*- coding: utf-8 -*- """ Word文档批量替换脚本功能说明: 1. 递归处理当前目录及所有子目录中的Word文档(.docx格式) 2. 将文档中的指定文本替换为新文本,同时保留原有格式 3…

网站推广视频的服务方案网站建设技术列表

连接ESP8266开发板到电脑 虚拟机选择开发板硬件连接 查看USB连接情况: lsusb 授权USB接口访问 成功连接 编译项目 上传到开发板 成功提供WIFI热点服务

荆门做网站公众号的公司企业网站备案网址

前言 最近我在Vue 3.3的项目中对Vant4做按需导入时,尽管按照Vant4的官方指南进行操作,但样式仍然无法正确加载。经过深入研究和多篇文章的比较,我终于找到了在Vue3中如何正确的按需导入Vant 4组件和样式的方法。由于Vue3.3和Vant4相对较新&am…

服务器创建多个网站吗seo引擎搜索

5. 命令 本部分描述了 LAMMPS 输入脚本的格式以及其中的命令如何用于定义 LAMMPS 模拟。主要包括以下内容。 5.1. LAMMPS 输入脚本 5.2.输入脚本的解析规则 5.3.输入脚本结构 本部分描述了典型的 LAMMPS 输入脚本的结构。 LAMMPS 发行版中的示例目录包含许多示例输入脚本…

不注册公司可以做网站吗wordpress文学模板

文章转载: https://www.howtoforge.com/tutorial/how-to-install-oracle-database-12c-on-centos-7/

居家养老网站建设wordpress侧边栏折叠

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 原型(Prototype)和原型链(Prototype Chain)⭐ 原型(Prototype)⭐ 原型链(Prototype Chain)⭐ 继承属性和方法⭐ 写在最后 ⭐ 专栏简介 前端入…

做企业网站都需要注意哪点赤峰seo

在平时,我们经常会碰到让一个div框针对某个模块上下左右都居中(水平垂直居中),其实针对这种情况,我们有多种方法实现。 方法一: 绝对定位方法:不确定当前div的宽度和高度,采用 transform: trans…

商城网站开发多在上海做兼职去哪个网站搜索

现如今,随着网络技术的进步,许多的场合都会需要光纤收发器进行远距离的传输,以致于现在国外和国内生产光纤收发器厂商非常多,产品线也极为丰富。收发器都是电转光的网络结构。接下来我们就来为大家详细介绍下单模光纤收发器以及光…