- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在学习多线程概念(一般来说,针对 C#.NET)。阅读不同的文章,仍然无法完全理解一些基本概念。
我发布 this问题。 “Hans Passant”解释得很好,但我无法理解其中的某些部分。所以我开始谷歌搜索。
我读了this没有答案的问题。
多线程和 MTA 相同吗?
假设我编写了一个 STA 的 WinForm 应用程序(如上所述其 Main() 方法),我仍然可以在我的应用程序中创建多个线程。我可以肯定地说我的应用程序是“多线程的”。这是否也意味着我的应用程序是 MTA?
在谈论 STA/MTA 时,大多数文章(如 this)都在谈论 COM/DCOM/Automation/ActiveX。这是否意味着 DotNet 与 STA/MTA 无关?
最佳答案
没有。 MTA 和 STA 一样,是单线程的属性。您现在作出完全相反的 promise ,您声明该线程绝对什么 都不做以保持外部代码线程安全。因此,无需调度员,您可以根据需要阻止尽可能多的时间。
这当然会产生后果,而且可能会非常不愉快。如果您的程序的 UI 线程位于 MTA 中,那将是致命的,因为它使用了太多从根本上讲是线程不安全的外部组件。剪贴板不起作用,拖放不起作用,OpenFileDialog 通常只是挂起您的程序,WebBrowser 不会触发其事件。
一些组件会检查这个并引发异常,但这个检查并没有始终如一地实现。 WPF 值得注意,虽然单元状态通常只对非托管代码有影响,但 WPF 借用了这个概念并提出“调用线程必须是 STA,因为许多 UI 组件都需要这个”。这有点误导,它的真正意思是线程必须有一个调度程序才能允许其控件工作。但在其他方面与 STA promise 一致。
当组件使用COM并且作者提供了代理时,它可以工作。 COM 基础结构现在介入使组件线程安全,它创建一个新的线程 STA 来给它一个安全的家。每个方法调用都会自动编码,以便在该线程上运行,从而提供线程安全性。完全等同于 Dispatcher.Invoke() 但完全自动完成。然而,结果是这很慢,通常需要几纳秒的简单属性访问现在可能需要几微秒。
如果该组件既支持 MTA 又支持 STA,那您就很幸运了。这并不常见,只有像 Microsoft 这样的公司才不遗余力地确保他们的库线程安全。
也许我应该强调,公寓的概念在 .NET Framework 中是完全缺失的。除了说明单元类型的基础知识外,这是必要的,因为 .NET 程序通常需要与非托管代码互操作。因此,使用工作线程编写 Winforms 应用程序就很好,而且这些工作线程始终位于 MTA 中,但是您必须自己处理线程安全问题,没有什么是自动的。
这通常很好理解,几乎每个人都知道如何使用 lock
关键字、Task 和 BackgroundWorker 类,并且知道更新 UI 需要 Control.Begin/Invoke() 方法从工作线程。使用 InvalidOperationException 在您出错时提醒您。将其留给程序员而不是系统来处理线程安全确实会使使用线程变得更加困难。但是给你很多机会比系统做得更好。这是必要的,在 20 世纪 90 年代后期的中间件大战中,Java 猛击它的脸时,这个系统提供的线程安全性受到了严重的打击。
关于C#.NET : "Multi Threaded Apartment" and "Multithreading",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38915308/
创建使用.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
我是一名优秀的程序员,十分优秀!