我的应用程序通过ThreadPool.QueueUserWorkItem产生不同的小工作者线程的负载,我通过多个ManualResetEvent实例跟踪。 我使用WaitHandle.WaitAll方法阻止我的应用程序closures,直到这些线程完成。 我从来没有任何问题,但是,因为我的应用程序正在更多的负载,即更多的线程被创build,我现在开始得到这个exception: WaitHandles must be less than or equal to 64 – missing documentation 什么是最好的替代解决scheme呢? 代码片段 List<AutoResetEvent> events = new List<AutoResetEvent>(); // multiple instances of… var evt = new AutoResetEvent(false); events.Add(evt); ThreadPool.QueueUserWorkItem(delegate { // do work evt.Set(); }); … WaitHandle.WaitAll(events.ToArray()); 解决方法 int threadCount = 0; ManualResetEvent finished = new ManualResetEvent(false); … Interlocked.Increment(ref threadCount); ThreadPool.QueueUserWorkItem(delegate […]
一些让我困惑的东西,但从来没有造成任何问题…推荐的事件派发方式如下: public event EventHandler SomeEvent; … { …. if(SomeEvent!=null)SomeEvent(); } 在multithreading环境中,这段代码如何保证另一个线程不会在检查null和调用事件之间改变SomeEvent的调用列表?
我的问题是有点相关: WebApi相当于HttpContext.Items与dependency injection 。 我们要使用Ninject在WebApi区域中使用HttpContext.Current注入一个类。 我担心的是,这可能是非常危险的 ,因为在WebApi( 一切? )是asynchronous的。 请纠正我,如果我在这些问题上错了,这是我到目前为止调查: HttpContext.Current通过线程获取当前上下文(我直接查看实现)。 使用HttpContext.Current里面的async Task是不可能的,因为它可以在另一个Thread上运行。 WebApi使用IHttpController和方法Task<HttpResponseMessage> ExecuteAsync =>每个请求都是async =>你不能使用HttpContext.Current里面的action方法。 它甚至可能发生,更多的请求由同一个线程执行。 创build控制器与注入东西到构造函数IHttpControllerActivator与同步方法IHttpController Create 。 这是ninject创buildController的所有依赖项的地方。 如果我在所有这4点中都是正确的,那么在动作方法或下面的任何图层中使用HttpContext.Current是非常危险的,并且会有意想不到的结果。 我看到很多接受的答案,正是这个build议。 恕我直言,这可以工作一段时间,但会在负载下失败。 但是,当使用DI来创build一个控制器和它的依赖关系时,这是正常的,因为它运行在一个单独的线程上。 我可以从构造函数中的HttpContext获得一个值,这将是安全的? 。 我想知道是否每个控制器都是在单个线程上为每个请求创build的,因为这可能会导致在负载很重的情况下可能会消耗来自IIS的所有线程的问题。 只是为了解释为什么我要注入HttpContext的东西: 一个解决scheme是获取控制器操作方法中的请求,并将所有层的所需值作为parameter passing,直到在代码中深处使用。 我们想要的解决scheme:所有的层之间都不受此影响,我们可以在代码深处使用注入的请求(例如,在一些依赖于URL的ConfigurationProvider中) 如果我总是错误的或者我的build议是正确的,请给我你的意见,因为这个主题似乎是非常复杂的。 Thx提前!
寻找一些简单的线程池实现的示例代码(C#)。 我在codeproject上find了一个,但代码库只是巨大的,我不需要所有的function。 无论如何,这是更多的教育目的。
在WinForms中,如何强制从UI线程立即进行UI更新? 我所做的大致是: label.Text = "Please Wait…" try { SomewhatLongRunningOperation(); } catch(Exception e) { label.Text = "Error: " + e.Message; return; } label.Text = "Success!"; 在操作之前,标签文本不会设置为“请稍候…”。 我解决了这个使用另一个线程的操作,但它变得毛茸茸的,我想简化代码。
我希望有人能够启发我,可能会导致这个错误: 试图读取或写入受保护的内存。 这通常表示其他内存已损坏。 我不能真的发布代码,因为这个错误似乎被扔在应用程序的任何区域。 抛出错误之前,应用程序将在12-48小时内运行。 有时它会停在一个看似随机的地方,并抛出上述错误,其他时候整个应用程序停止,我得到一个错误的屏幕说,沿着“有一个致命的错误在…这可能是一个错误在CLR或…“关于PInvoke或其他不相关的信息。 发生这种情况时,所有线程都显示终止,并且没有可用的debugging信息。 简而言之,这是应用程序的function: 它是一个完全用C#编写的multithreading服务器应用程序。 客户端通过套接字连接到服务器。 服务器运行一个虚拟的“环境”,用于客户可以互相交互的环境和环境。 它消耗了相当多的记忆,但我没有看到它泄漏。 它通常消耗大约1.5GB。 我不认为它泄漏,因为内存使用保持相对恒定的应用程序运行的整个时间。 它不断运行的代码来维护环境,即使客户没有做任何事情。 它不使用第三方软件或其他API。 此应用程序使用的唯一外部资源是套接字连接和SQL数据库连接。 它运行在64位服务器上。 我曾尝试在VS2008&VS2010中使用.net 2.0,3.5和4.0在多个服务器上进行debugging,并且问题仍然最终发生。 我试过closures编译器优化和几个微软的hot-fixes。 似乎没有什么使这个问题消失。 如果有人知道任何可能的原因,或者某种方式来确定导致问题的原因,我们将不胜感激。
我正在使用Tasks在我的ViewModel中运行长时间运行的服务器调用,并使用TaskScheduler.FromSyncronizationContext()将结果整理回Dispatcher器。 例如: var context = TaskScheduler.FromCurrentSynchronizationContext(); this.Message = "Loading…"; Task task = Task.Factory.StartNew(() => { … }) .ContinueWith(x => this.Message = "Completed" , context); 这在我执行应用程序时正常工作。 但是当我在Resharper上运行我的NUnittesting时,我得到了FromCurrentSynchronizationContext调用的错误消息: 当前的SynchronizationContext不能用作TaskScheduler。 我想这是因为testing工作线程上运行。 我怎样才能确保testing在主线程上运行? 欢迎任何其他build议。
背景:我们已经在我们现有的一个Rails应用程序中构build了一个聊天function。 我们使用新的ActionController :: Live模块并运行Puma(在生产中使用Nginx),并通过Redis订阅消息。 我们使用EventSource客户端来asynchronousbuild立连接。 问题摘要:连接终止时,线程永远不会死亡。 例如,如果用户离开,closures浏览器,甚至到应用程序中的不同页面,则会生成一个新线程(如预期的那样),但是旧线程继续存在。 我现在看到的问题是,当发生这些情况时,服务器无法知道浏览器端的连接是否终止,直到试图写入这个断开的stream,而浏览器永远不会发生已经离开原来的页面。 这个问题似乎被logging在github上 ,并且在StackOverflow上也有类似的问题(相当好的问题)和这里(关于获取活动线程的数量) 。 基于这些post,我能够想出的唯一解决scheme是实现一种线程/连接扑克。 试图写入一个断开的连接会生成一个IOError ,我可以捕获并正确closures连接,从而使线程死亡。 这是该解决scheme的控制器代码: def events response.headers["Content-Type"] = "text/event-stream" stream_error = false; # used by flusher thread to determine when to stop redis = Redis.new # Subscribe to our events redis.subscribe("message.create", "message.user_list_update") do |on| on.message do |event, data| # when message is received, write […]
我开始使用C ++使用OpenMP。 我有两个问题: 什么是#pragma omp for schedule ? dynamic和static什么区别? 请用例子来解释一下。
我怎样才能检查一个std::thread是否仍在运行(平台独立的方式)? 它缺lesstimed_join()方法,而timed_join()并不意味着这一点。 我想在线程中使用std::lock_guardlocking一个互斥锁,并使用互斥锁的try_lock()方法来确定它是否仍然被locking(线程正在运行),但对我而言似乎不必要的复杂。 你知道更优雅的方法吗? 更新:要清楚:我想检查线程干净退出或不。 为此,“悬挂”线程被认为正在运行。