- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
委托(delegate)是一些使 .NET 中的线程更容易的对象 reference .它们可用于异步调用方法。框架 4.5(或更早版本)中还有哪些其他对象可以使线程的使用更容易或更不容易出错?
还有哪些抽象使并发和多线程更容易?
注意:此问题更新 this .
最佳答案
我倾向于回答很多与多线程相关的问题,而且我经常看到以各种不同方式提出的相同基本问题。我将介绍多年来我所看到的最常见的问题,并解释新技术如何使解决这些问题变得更容易。
结束循环变量
这不是线程特有的问题,但线程的使用肯定会放大问题。 C# 5.0 为 foreach
修复了这个问题通过为每次迭代创建一个新变量来循环。您将不再需要为 lambda 表达式闭包创建特殊变量。不幸的是,for
循环仍然需要使用特殊的捕获变量来处理。
等待异步任务完成
.NET 4.0 引入了 CountdownEvent
类里面封装了很多等待很多任务完成所需的逻辑。大多数初级开发人员使用 Thread.Join
来电或单WaitHandle.WaitAll
打电话。这两者都有可扩展性问题。旧模式是使用单个 ManualResetEvent
并在计数器达到零时发出信号。计数器已使用 Interlocked
更新类。 CountdownEvent
使这种模式更容易。请记住,将您的 main 也视为一个 worker ,以避免在所有 worker 排队之前一个 worker 完成时可能发生的微妙竞争条件。
.NET 4.0 还引入了 Task
可以通过 TaskCreationOptions.AttachedToParent
链接子任务的类.如果您拨打 Task.Wait
在父级上,它也会等待所有子任务完成。
生产者-消费者
.NET 4.0 引入了 BlockingCollection
类的行为类似于普通队列,但它可以在集合为空时阻塞。您可以通过调用 Add
将对象排队。并通过调用 Take
使对象出列. Take
阻塞直到一个项目可用。这大大简化了生产者-消费者逻辑。过去,开发人员试图编写自己的阻塞队列类。但是,如果你不知道你在做什么,那么你真的可以把它搞砸......糟糕。事实上,长期以来,微软在 MSDN 文档中有一个阻塞队列示例,它本身就被严重破坏了。幸运的是,它已被删除。
使用工作线程进度更新 UI
简介BackgroundWorker
使新手开发人员更容易从 WinForm 应用程序中分离后台任务。主要好处是可以拨打ReportProgress
来自 DoWork
事件处理程序和 ProgressChanged
事件处理程序将自动编码到 UI 线程上。当然,任何在 SO 上跟踪我的答案的人都知道我对编码(marshal)操作(通过 Invoke
等)作为使用简单进度信息更新 UI 的解决方案的感受。我一直在抨击它,因为它通常是一种可怕的方法。 BackgroundWorker
仍然迫使开发人员进入推送模型(通过后台的编码操作),但至少它在幕后完成了所有这些。
Invoke 的不雅
我们都知道一个 UI 元素只能从 UI 线程访问。这通常意味着开发人员必须通过 ISynchronizeInvoke
使用编码(marshal)操作。 , DispatcherObject
, 或 SynchronizationContext
将控制权转移回 UI 线程。但让我们面对现实吧。这些编码操作看起来很难看。 Task.ContinueWith
让它更优雅一点,但真正的荣耀归于 await
作为 C# 5 新异步编程模型的一部分。 await
可用于等待 Task
以这样一种方式完成,即在任务运行时暂时中断流控制,然后在正确的同步上下文中的那个位置返回。没有什么比使用 await
更优雅和令人满意的了作为所有这些的替代品 Invoke
调用。
并行编程
我经常看到一些问题,询问事情如何并行发生。旧的方法是创建几个线程或使用 ThreadPool
. .NET 4.0 使用了 TPL 和 PLINQ。 Parallel
class 是让循环的迭代并行进行的好方法。和 PLINQ 的 AsParallel
对于普通的旧 LINQ 来说,这是同一枚硬币的另一面。这些新的 TPL 特性极大地简化了此类多线程编程。
.NET 4.5 引入了 TPL 数据流库。它旨在使原本复杂的并行编程问题变得优雅。它将类抽象为块。它们可以是目标块或源块。数据可以从一个块流到另一个块。有许多不同的块,包括 BufferBlock<T>
, BroadcastBlock<T>
, ActionBlock<T>
,等等,都做不同的事情。当然,整个库将针对新的 async
进行优化。和 await
关键词。这是一组令人兴奋的新类(class),我认为它会慢慢流行起来。
优雅终止
你如何让线程停止?我经常看到这个问题。最简单的方法是拨打Thread.Abort
,但我们都知道这样做的危险......我希望。有许多不同的方法可以安全地做到这一点。 .NET 4.0 通过 CancellationToken
引入了一个更统一的概念,称为取消。和 CancellationTokenSource
.后台任务可以轮询IsCancellationRequested
或拨打 ThrowIfCancellationRequested
在安全的地方优雅地中断他们正在做的任何工作。其他线程可以拨打Cancel
要求取消。
关于c# - 哪些 .NET 4.5(或更早版本)更高级别的构造使线程更容易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10533971/
创建使用.NET框架的asp.net页面时,访问该页面的客户端是否需要在其计算机上安装.NET框架? IE。用户访问www.fakesite.com/default.aspx,如果他们没有安装框架,他
我阅读了很多不同的博客和 StackOverflow 问题,试图找到我的问题的答案,但最后我找不到任何东西,所以我想自己问这个问题。 我正在构建一个应用程序,其中有一个长时间运行的工作线程,它执行一些
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 我一直想知道为什么微软为这样一个伟大的平台选择了一个如此奇怪的、对搜索引擎不友好的名称。他们就
.Net Framework .Net .NET Standard的区别 1、.NET Framework 在未来.NET Framework或许成为过去时,目前还是有很多地方在使用的。这一套
如果有选择的话,您会走哪条路? ASP.NET Webforms + ASP.NET AJAX 或 ASP.NET MVC + JavaScript Framework of your Choice
我有一个 Web 服务,它通过专用连接通过 https 使用第三方 Web 服务,我应用了 ServicePointManager.ServerCertificateValidationCallbac
为什么我应该选择ASP.NET Web Application (.NET Framework)而不是ASP.NET Core Web Application (.NET Framework)? 我在
我在网络上没有找到任何关于包含 .NET Standard、.NET Core 和 .NET Framework 项目的 .NET 解决方案的公认命名约定。 就我而言,我们在 .NET 框架项目中有以
.NET Compact 是 .NET 的完美子集吗? 假设我考虑了屏幕大小和其他限制并避免了 .NET Compact 不支持的类和方法,或者 .NET Compact 是一个不同且不兼容的 GUI
我已经阅读了所有我能找到的关于 connectionManagement 中的 maxconnection 设置的文章:即 http://support.microsoft.com/kb/821268
我现在正在使用asp.net mvc,想知道使用内置的Json或 Json.Net哪个是更好的选择,但我不确定一个人是否比另一个人有优势。 另外,如果我确实选择沿用Json.Net的路线,那么我应该选
在 Visual Studio 中,您至少可以创建三种不同类型的类库: 类库(.NET Framework) 类库(.NET 标准) 类库(.NET Core) 虽然第一个是我们多年来一直使用的,但我
.NET 和 ASP.NET 之间有什么区别?它们有什么关系? 最佳答案 ASP.Net 基于 .Net 框架构建,提供有关 Web 开发的附加功能。 你可以去看看wikipedia article
在安装更高版本(3.0)之前,我需要安装.net框架1.1和2.0吗?或者单独安装 3.0 框架就足够了,并为在早期框架版本上编写的软件提供支持?谢谢 ,丽然 最佳答案 不,您不必安装以前的框架。 我
我正在开发一个项目,人们可以“更新”类别,例如更改类别的名称。我收到以下消息 This is called after clicking update 按钮 with the SQL statemen
.NET 类 System.Net.CookieContainer 线程安全吗? --更新:交 key 答复-- 是否有任何方法可以确保异步请求期间修改的变量(即 HttpWebRequest.Coo
我正在使用 JScript.NET 在我编写的 C# WinForms 应用程序中编写脚本。它工作得很好,但我只是尝试在脚本中放置一些异常处理,但我无法弄清楚如何判断我的 C# 代码抛出了哪种类型的异
我需要你的帮助, 比如我有一个小数类型的变量,我想这样取整。 例如 3.0 = 3 3.1 = 4 3.2 = 4 3.3 = 4 3.4 = 4 3.5 = 4 3.6 = 4 3.7 = 4 3.
我使用过这样的代码:http://msdn.microsoft.com/en-us/library/dw70f090.aspx在 ASP.NET 中工作之前访问数据库(2-3 年前)。我没有意识到我正
自 ConfigurationManager .NET Standard 中不存在,检索正在执行的程序集的应用程序设置的最佳方法是什么,无论是 web.config或 appSettings.{env
我是一名优秀的程序员,十分优秀!