Tag: threadpool

如何制作委托线程STA

我看到围绕这个主题的一些讨论并得出结论认为这是不可能的。 我应该使用Threads,使它成为STA,当我需要返回结果时,将主线程与创建的线程连接起来。 这可以工作,但它不是一个理想的解决方案,因为使用委托我可以实现纯异步行为(使用回调)。 所以,在我开始实现自己的Future类之前(就像在Java中一样); 有没有更好的方法来使用代表实现这一目标? private delegate String DelegateFoo(String[] input); private String Foo(String[] input){ // do something with input // this code need to be STA // below code throws exception .. that operation is invalid // Thread.CurrentThread.SetApartmentState(ApartmentState.STA) return “result”; } private void callBackFoo(IAsyncResult iar){ AsyncResult result = (AsyncResult)iar; DelegateFoo del = (DelegateFoo)result.AsyncDelegate; String result […]

Thread.CurrentThread.CurrentCulture不在线程池内的线程中工作

我有一个方法将在一个线程内调用,这些线程由线程池管理。 该方法调用DLL的方法,遗憾的是,该方法需要特定的语言环境才能正确执行。 在通过threadpool运行此方法之前,我已经在应用程序的主线程中运行时进行了测试,同时我手动管理线程并且工作正常,但是当我将其放入线程池内工作时,语言环境不会应用,因此该方法行为不正确。 以下是应该受区域设置更改影响的方法部分(但行为不正常): CultureInfo before = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = new CultureInfo(“fa-IR”); int result = tsms.SendSMS(smsTask.MobileNumber.MobileNumberInString, smsTask.Message); Thread.CurrentThread.CurrentUICulture = before; 这是线程池创建结构: foreach (SMSTask smsTask in tasksList) { if (this.threadsCount < this.threadPoolSize) { this.threadsCount++; ThreadPool.QueueUserWorkItem(new WaitCallback(SendMessage), (object)smsTask); } } 我也尝试将locale设置为如下所示的线程对象,但它没有解决问题:(第2行和第3行): threadObject = new Thread(new ThreadStart(TaskProcessingThreadFunction)); threadObject.CurrentCulture = new CultureInfo(“fa-IR”); threadObject.CurrentUICulture = new CultureInfo(“fa-IR”); threadObject.Start(); 请指导我在线程池中运行此方法时应该如何获得正确的结果。 更新后的版本: […]

如何告诉线程池在`STA`线程上运行委托?

我需要一个线程池来处理ASP.NET项目中的COM对象。 QueueUserWorkItemSTA(WaitCallback)

停止multithreadingWindows服务

我在.Net 3.5中有一个multithreading的Windows服务,当创建多个线程时,我有一些麻烦来正确停止服务。 这项服务用于创建一个线程来完成所有工作,我只是将其更改为multithreading。 它工作正常,但是当服务停止时,如果正在执行多个线程,它将挂起服务直到所有线程都完成。 当服务启动时,我创建一个后台线程来处理主进程: protected override void OnStart(string[] args) { try { //Global variable that is checked by threads to learn if service was stopped DeliveryConstant.StopService = false; bool SetMaxThreadsResult = ThreadPool.SetMaxThreads(10, 10); ThreadStart st = new ThreadStart(StartThreadPool); workerThread = new Thread(st); workerThread.IsBackground = true; serviceStarted = true; workerThread.Start(); } catch (Exception ex) { […]

请求在Azure AppService中排队,尽管它在线程池中有足够的线程

我使用asp.net webapi编写了一个api,并将其部署在azure中作为Appservice。 我的控制器的名称是TestController,我的动作方法类似于波纹管。 [Route(“Test/Get”)] public string Get() { Thread.Sleep(10000); return “value”; } 因此,对于每个请求,它应该在返回字符串“value”之前等待10秒。 我还编写了另一个端点来查看threadpool中用于执行请求的线程数。 这个动作就像吼叫一样。 [Route(“Test/ThreadInfo”)] public ThreadPoolInfo Get() { int availableWorker, availableIO; int maxWorker, maxIO; ThreadPool.GetAvailableThreads(out availableWorker, out availableIO); ThreadPool.GetMaxThreads(out maxWorker, out maxIO); return new ThreadPoolInfo { AvailableWorkerThreads = availableWorker, MaxWorkerThreads = maxWorker, OccupiedThreads = maxWorker – availableWorker }; } 现在,当我们同时向Test / Get端点发出29次调用时,所有请求都需要大约11秒才能成功。 因此服务器在11个线程中同时执行所有请求。 […]

Thread.Sleep会影响ThreadPool吗?

我需要为自己的目的控制一个线程:计算,等待,报告等… 在所有其他情况下,我正在使用ThreadPool或TaskEx。 在调试器中,当我在做Thread.Sleep() ,我注意到UI的某些部分变得不那么负责了。 虽然,没有调试器似乎工作正常。 问题是:如果我正在创建新的Thread和Sleep() ,它会影响ThreadPool / Tasks吗? 编辑:这是代码示例: 我的应用中的一个随机位置: ThreadPool.QueueUserWorkItem((state) => { LoadImageSource(imageUri, imageSourceRef); }); 我的应用中的另一个随机位置: var parsedResult = await TaskEx.Run(() => JsonConvert.DeserializeObject(resultString, Constants.JsonSerializerSettings)); 我的ConcurrentQueue(修改后,原文取自此处 ): 为队列需要创建线程: public void Process(T request, bool Async = true, bool isRecurssive = false) { if (processThread == null || !processThread.IsAlive) { processThread = new Thread(ProcessQueue); processThread.Name = […]

如何使Win服务长期运行线程

我有一个win服务托管一些我需要长时间运行的工作流程(WorkflowApplication和WorkflowServiceHost)。 因为OnStart()要求它完成并返回到操作系统,所以我有一个主方法可以触发线程池中的另一个线程。 我的Onstart()主要看起来像这样 protected override void OnStart(string[] args) { eventLog.WriteEntry(“Service starting…”); ThreadPool.QueueUserWorkItem(new WaitCallback(ServiceMainThread)); Thread.Sleep(100); eventLogCms.WriteEntry(“Service Started.”); } ServiceMainThread()是我的工作流程执行和实现核心function的方法。 当我在Windows 7机器上启动服务时,它运行然后在大约8分钟后死亡。 在Win Server 2008上,线程永远不会执行。 所以我认为我已经错误地实现了线程,而且什么是ServiceMainThread有点不对劲。 我愿意接受有关可以改进的建议或任何方向的建议,因为我刚接触线程.Net。 ServiceMainThread中的基本线程代码编码如下: private void ServiceMainThread(object state) { // .. execute workflows .. eventLog.WriteEntry(“Workflows executed.”); while(alive) { Thread.Sleep(1); // … check workflow states and ensure they’re still executing … } // .. […]

Mono ThreadPool并发问题

我写了一个使用ThreadPool进行multithreading处理的软件。 ThreadPool.SetMinThreads(128, 128); ThreadPool.SetMaxThreads(512, 512); for (int i = 0; i { Console.Write(“!”); Thread.Sleep(1000); Console.Write(“.”); }, null); } 在每个线程内部,我执行阻塞网络操作(使用http)。 围绕阻塞网络模型而设计的软件我无法转向非阻塞1线程I / O. 它在Windows平台上运行完美,每个核心可以使用128-512个线程,没有任何问题,所有工作都应该工作。 但当我转向单声道时,我看到了一些非常奇怪的行为。 我不能让每个CPU核心运行多个线程,我可以得到 – 每个核心1个线程,无论我在SetMinThreads / SetMaxThreads中指定了什么。 在Linux下使用.NET 4 / 4.5,MONO版本3.2.1以及我之前系统上的一些旧版本。 顺便说一句,普通线程代码运行良好,例如,这给出了所需的结果: for (int i = 0; i { Console.Write(“!”); Thread.Sleep(1000); Console.Write(“.”); }); t.Start(); }

System.Threading.ThreadPool.SetMaxThreads的默认值

假设,我没有通过调用函数显式设置任何值: System.Threading.ThreadPool.SetMaxThreads 什么是默认值?

澄清线程池最大线程

我在这里读到: 在v2.0,3.5和4.0中,ASP.NET 初始化 每个处理器(核心)100个线程的CLR ThreadPool 这是正确的,我检查了它( 我有8个核心机器,所以8 * 100 = 800 ): 但后来我看到了这个和这个 : maxWorkerThreads – 基于每个CPU配置进程使用的最大工作线程数。此属性的范围是5 through 100.默认值为20 。 题 我不知道数字如何适合这里: 第一段说明每个核心最多有100个线程 (图像certificate了它,我有8个核心)。 但第二段指出每个核心的默认最大工作线程数为20.因此,如果我有8个核心,那么我必须有8 * 20 = 160个最大线程。 不是 800。 有人可以光明吗? 更新: 我刚刚找到了一种通过c#代码获取关键元素值的方法: 所以现在数字适合,但仍然 – MSDN说默认值是20,而不是100 然后他们确实提到了100: 这是怎么回事?