Tag: multithreading

NET 4.0 SpinWait方法与4.0之前的SpinWait()有何不同?

MSDN “线程安全集合.NET Framework 4”声明: “一些并发集合类型使用轻量级同步机制,如SpinLock , SpinWait , SemaphoreSlim和CountdownEvent ,它们是.NET Framework 4中的新增function” 虽然MSDN网站告诉SpinWaitwas可用于.NET 1.1,而另一篇MSDN文章从.NET 4.0启动SpinWaitwas 好吧,好奇心来自Lee Grissom的评论,以回答SynchronizedCollection和其他并发集合之间的区别是什么? : “@Matt,.NET4并发类使用SpinWait对象来解决线程安全而不是Monitor.Enter / Exit(又称Critical部分)?” 以及第一个NSDN引用声明SpinWait是.NET 4.0的新手 那么,它是新的还是不是? 如果新的那么如何?

如何异步处理消息,在处理时丢弃任何新消息?

我有一个C#应用程序订阅我们的消息传递系统上的主题以进行价值更新。 当一个新值出现时,我会进行一些处理,然后继续。 问题是,更新可以比应用程序处理它们更快。 我想要做的就是坚持最新的价值,所以我不想要一个队列。 例如,源发布值“1”,我的应用程序接收它; 在处理时,源在我的应用程序完成处理之前发布序列(2,3,4,5); 我的应用程序然后处理值“5”,抛弃先前的值。 由于它是基于专有的消息传递库,所以很难发布一个有效的代码示例,但我认为这是一个常见的模式,我只是无法弄清楚它的名称是什么……似乎处理函数必须运行在一个单独的线程上,而不是消息回调,但我不知道如何组织它,例如如何通知该线程的值更改。 关于我需要做什么的一般提示?

如何防止方法跨多个线程运行?

我正在开发一个Web应用程序,其中有几个用户可以更新相同的记录。 因此,如果用户同时更新同一记录,以避免出现问题,我将其更改保存在队列中。 当每次保存发生时,我想调用一个在另一个线程上处理队列的方法,但我需要确保该方法在另一个线程中再次调用时不能运行。 我已经阅读了几篇关于这个主题的post,但不确定什么对我的情况最好。 以下是我现在的代码。 这是处理它的正确方法吗? public static class Queue { static volatile bool isProcessing; static volatile object locker = new Object(); public static void Process() { lock (locker) { if (!isProcessing) { isProcessing = true; //Process Queue… isProcessing = false; } } } }

无法设置指定的COM单元状态

看来我对multithreading应用程序真的不太好。 我正在尝试打开FolderBrowserDialog ,但我得到一个exception告诉我: Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. 我在我的Main方法中设置了STAThreadAttribute ,但是从我的主线程以外的线程调用FolderBrowserDialog。 我试过了 Thread.CurrentThread.SetApartmentState(ApartmentState.STA); 但是这给了exceptionFailed to set the specified COM apartment state 。 我有一个临时修复,在STA模式下创建一个新线程并打开FolderBrowserDialog ,但我想有一个更整洁的解决方案。 导致无法将公寓状态设置为STA的原因是什么?

我可以在后台线程中访问会话吗?

如何在c#.net webapplication中的后台线程中访问我的项目会话? 它给了我session值= null。 任何的想法?

使用Linq to SQL进行multithreading处理

我正在构建一个应用程序,它要求我使用DataContext的内部线程。 我的应用程序不断抛出InvalidOperationException类似于: There is already an open DataReader associated with this Command which must be closed first ExecuteReader requires an open and available Connection. The connection’s current state is connecting 这些例外是间歇性的。 这是我的代码片段: var repo = new Repository(); var entities = repo.GetAllEntities(); foreach (var entity in entities) { ThreadPool.QueueUserWorkItem( delegate { try { ProcessEntity(entity); } catch […]

C#Lazy Initialization && Race-to-initialize?

在阅读了LazyInitializer ,它是: 它提供了另一种初始化模式,它有多个线程竞争初始化。 这是一个示例: Expensive _expensive; public Expensive Expensive { get // Implement double-checked locking { LazyInitializer.EnsureInitialized (ref _expensive,() => new Expensive()); return _expensive; } } 问题#1 看着 : 为什么#A说它实现了双重检查锁定? 这只是一个获得的优势? 问题2 #B(lambda表达式)是否是线程安全的? 问题#3 所以我通过查看样本来搜索这个“竞赛初始化”的事情: volatile Expensive _expensive; public Expensive Expensive { get { if (_expensive == null) { var instance = new Expensive(); Interlocked.CompareExchange […]

正确加载后台线程上的文档

从我编写的应用程序和我inheritance的应用程序开始,我一直希望更好地理解在后台线程上加载数据的线程安全问题。 假设我有一个简单的单窗口Windows窗体应用程序,带有“加载”按钮和BackgroundWorker : 按钮的Click处理程序调用loadBackgroundWorker.RunWorkerAsync() ,并且worker的DoWork处理程序创建并初始化Document类型的对象,该对象在加载后存储在表单的LoadedDocument属性中。 在worker的RunWorkerCompleted处理程序中, MessageBox显示LoadedDocument的属性。 我知道这很难想象,所以我要包含完整的代码。 很抱歉,这个问题需要很长时间才能阅读。 这是表单的代码: using System; using System.ComponentModel; using System.Windows.Forms; namespace BackgroundLoadTest { public partial class Form1 : Form { private Document _loadedDocument; public Document LoadedDocument { get { lock (this) { return _loadedDocument; } } set { lock (this) { _loadedDocument = value; } } } public Form1() […]

BackgroundWorker完成了事件 – 哪个线程?

BackgroundWorker控件的已完成事件是否返回到GUI线程上,或者我是否必须将其重新编组。 此外,进度事件是否会返回到GUI线程上,还是我必须将其重新编组?

ThreadPool没有立即启动新线程

我有一个C#Windows服务启动各种对象(类库)。 这些对象中的每一个都有自己的“处理”逻辑,通过使用ThreadPool启动多个长时间运行的处理线程。 我有一个例子,就像这样: System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(WorkerThread_Processing)); 这很好用。 我的应用程序没有任何问题,我的线程运行良好。 现在,对于回归测试,我启动了相同的对象,但是从C#Console应用程序而不是Windows服务。 它调用相同的确切代码(因为它调用相同的对象),但WorkerThread_Processing方法在启动之前延迟最多20秒。 我已经进入并从ThreadPool切换到Thread ,问题就消失了。 这可能会发生什么? 我知道我没有超过MaxThreads计数(我最多开始20个线程)。