Tag: multithreading

何时在线程安全锁定代码中使用’volatile’或’Thread.MemoryBarrier()’? (C#)

我什么时候应该使用volatile / Thread.MemoryBarrier()来保证线程安全?

什么时候使用Thread.Sleep()是明智的?

我总是看到人们使用Thread.Sleep()来创建处理延迟或类似的东西,人们总是被这种方式使用它而受到嘲笑。 什么时候使用Thread.Sleep()是明智/需要的?

.NET – 检测到ContextSwitchDeadlock

我在c#(.net 3.5 cp,vs2010)中有一个类,它执行复杂的计算,这通常需要很长时间。 一分钟后,抛出exception,检测到ContextSwitchDeadlock。 exception是本地化的,对于我的非英语语言,所以我不能复制粘贴,但意思如下:¨CLR模块无法从上下文COM …转换到上下文COM … 60秒。 拥有目标上下文/公寓的子进程可能正在进行非抽空等待或处理非常长时间运行的操作而不会抽取Windows系统消息。 基本上,看起来我的应用程序是计算并且长时间没有响应窗口,Visual Studio关闭它并报告可疑的死锁。 我试图做一些研究,找到两个解决方案: 禁用visual studio debbuger中的某些选项以检测死锁。 Dost不适合我,因为它仅用于调试目的。 调用一些DoEvents方法,但它是用于Windows窗体而不是WPF,我使用的是WPF。 还有建议创建单独的线程,但我是完全新的线程,不知道我该怎么做。 有什么建议吗?

entity framework延迟加载不适用于其他线程

我刚刚发现Entity Framework中的延迟加载仅适用于创建ObjectContext的线程。 为了说明这个问题,我做了一个简单的测试,一个简单的模型只包含2个实体: Person和Address 。 这是代码: private static void TestSingleThread() { using (var context = new TestDBContext()) { foreach (var p in context.Person) { Console.WriteLine(“{0} lives in {1}.”, p.Name, p.Address.City); } } } private static void TestMultiThread() { using (var context = new TestDBContext()) { foreach (var p in context.Person) { Person p2 = p; […]

什么时候.NET Monitor完全进入内核模式?

我想编译一个列表,列出所有可能的条件,使Monitor转到内核模式/使用内核同步对象。 同步块有一个引用内核对象的字段,因此我推断lock将在某个时候进入内核模式。 我发现了这一点: .NET中的Lock(Monitor)内部实现 但它有太多的问题无法回答,唯一有用的信息是OP通过简单地说明lock将在某个时候进入内核模式来回答他自己的问题。 此外,没有任何链接可以支持该答案。 我的问题是不同的 – 我想知道什么时候确切的lock将进入内核模式 (不是,如果不是为什么 – 何时)。 如果与旧版本有任何不同,我更感兴趣的是听到.NET 4和4.5 编辑:从里希特书中:“同步块包含内核对象的字段,拥有线程的ID,递归计数和等待的线程计数。”

ReaderWriterLockSlim与Monitor

我有一个IDictionary实现,它在内部保存另一个Dictionary并通过密钥的HashCode将这些插入分发到invidual子词典。 有16个子词典,4核机器上的冲突数量非常少。 对于并行插入,我使用ReaderWriterLockSlim锁定Add方法,仅锁定单个子字典: public void Add(TKey key, TValue value) { int poolIndex = GetPoolIndex(key); this.locks[poolIndex].EnterWriteLock(); try { this.pools[poolIndex].Add(key, value); } finally { this.locks[poolIndex].ExitWriteLock(); } } 当插入具有四个线程的项目时,我只有大约32%的CPU使用率和糟糕的性能。 所以我用Monitor替换了ReaderWriterLockSlim(即lock关键字)。 CPU使用率目前接近100%,性能提高了一倍多。 我的问题是:为什么CPU使用率会增加? 碰撞次数不应该改变。 是什么让ReaderWriterLock.EnterWriteLock等了这么多次?

Web API服务 – 如何使服务器上的请求同时执行

我正在使用由IIS 7.5托管的WebApirest服务控制器,我从这篇文章中了解到: 是否所有Web请求都是并行执行的并且是异步处理的? 默认情况下, webApi服务并行执行所有传入请求, 但 前提是当前多个请求 (在特定时间)来自不同的会话。 也就是说,如果单个客户端将同时向服务器发送一些请求,则所有这些请求将按顺序执行,并且不会同时执行 。 这种行为对我们来说是一个真正的问题 ,因为在某些情况下,我们的客户端会异步地(通过浏览器)从不同客户端的侦听器发送大量请求,并且所有这些请求实际上都会排队,而不是在服务器上同时执行 。 因此,在某些情况下,我们遇到了严重的性能问题 ,这些问题在客户的网页上非常明显。 我们怎样才能解决这个问题? 我知道我们可以禁用会话状态,但这不是正常的事情。

始终在Windows服务上运行线程

我正在编写一个Windows服务,它将启动多个工作线程,这些线程将监听Amazon SQS队列并处理消息。 将有大约20个线程监听10个队列。 线程必须始终运行,这就是为什么我倾向于实际使用实际线程作为工作循环而不是线程池线程。 这是一个顶级实现。 Windows服务将启动多个工作线程,每个线程都会监听它的队列和进程消息。 protected override void OnStart(string[] args) { for (int i = 0; i < _workers; i++) { new Thread(RunWorker).Start(); } } 这是工作的实施 public async void RunWorker() { while(true) { // .. get message from amazon sqs sync.. about 20ms var message = sqsClient.ReceiveMessage(); try { await PerformWebRequestAsync(message); await InsertIntoDbAsync(message); } […]

Thread.Sleep或Thread.Yield

我有一个方法,使用后台工作程序轮询DLL的状态,如下所示: var timeout = DateTime.Now.AddSeconds(3); while (System.Status != Status.Complete // our status is not complete && DateTime.Now < timeout // have not timed out && !_Worker.CancellationPending) // backgroundworker has not been canceled { //Thread.Yield(); //Thread.SpinWait(1); //Thread.Sleep(1); } 在查看我的CPU%时, yield()和spinwait()会导致我的应用在我的电脑上拍摄高达50%。 使用Sleep(1)我的CPU%保持在6%。 有人告诉我,我应该选择Thread.Yield() ,但CPU%的峰值Thread.Yield()我烦恼。 对于这样的事情,最佳做法是什么?

在ASP.NET Web应用程序中创建线程的正确方法

我正在创建asmx Web服务,并且必须创建线程来执行后台IO来刷新系统数据。 什么是正确的方法? 我对创建线程没有任何结果感兴趣。 我只是希望ASP.NET工作线程创建一个执行它加载的线程,最后进行一次分配(我认为分配_alldata = newData是primefaces,我自己的大结构类SystemData的两个实例)所以创建的工作线程新线程可以立即传播。 我读了一篇文章http://msdn.microsoft.com/fi-fi/magazine/cc164128%28en-us%29.aspx#S2 ,建议使用非线程池线程。 然而,文章是关于不同/更复杂的情况,并没有帮助我这么多。 谢谢:马蒂 PS。 我也问过这个问题, 在asmx web服务中为数据库IO生成线程的正确方法是什么? 但这个问题太复杂了。