Tag:

如何知道所有线程池的线程是否已完成其任务?

我有这个应用程序将递归给定目录中的所有文件夹并查找PDF。 如果找到PDF文件,应用程序将使用ITextSharp对其页面进行计数。 我这样做是通过使用一个线程递归扫描pdf的所有文件夹,然后如果找到PDF,它将排队到线程池。 代码如下所示: //spawn a thread to handle the processing of pdf on each folder. var th = new Thread(() => { pdfDirectories = Directory.GetDirectories(pdfPath); processDir(pdfDirectories); }); th.Start(); private void processDir(string[] dirs) { foreach (var dir in dirs) { pdfFiles = Directory.GetFiles(dir, “*.pdf”); processFiles(pdfFiles); string[] newdir = Directory.GetDirectories(dir); processDir(newdir); } } private void processFiles(string[] […]

将单线程应用程序迁移到multithreading,并行执行,蒙特卡罗模拟

我的任务是采用现有的单螺纹蒙特卡罗模拟并对其进行优化 。 这是ac#console app,没有db访问它从csv文件加载一次数据并在最后写出来,所以它几乎只是CPU绑定 ,也只使用大约50mb的内存。 我通过Jetbrains dotTrace探查器运行它。 在总执行时间中,约30%产生均匀随机数,24%将均匀随机数转换为正态分布随机数。 基本算法是一大堆嵌套for循环 ,在中心有随机数调用和矩阵乘法,每次迭代返回一个加到结果列表中的double,这个列表定期排序并测试一些收敛标准(检查时)如果可以接受的话,程序会从循环中分出并写入结果,否则它会继续到最后。 我希望开发人员能够权衡: 我应该使用新的Thread v ThreadPool 我应该查看Microsoft Parallels Extension库 我应该看看AForge.Net Parallel.For , http://code.google.com/p/aforge/任何其他图书馆? 由于我从未编写任何并行或multithreading代码,因此欢迎使用上述教程的一些链接 。 生成大量正态分布随机数的最佳策略,然后消耗它们。 应用程序从未在此状态下使用统一随机数,它们始终转换为正态分布然后消耗。 用于随机数生成的良好快速库(并行?) 考虑到内存因素,我需要多少额外的内存 。 当前应用程序需要2个小时进行500,000次迭代,业务需要将其扩展到3,000,000次迭代,并且每天被称为多次,因此需要进行一些繁重的优化。 特别想听听使用Microsoft Parallels Extension或AForge.Net Parallel的人的意见 这需要相当快地生产,所以即使我知道它已经出现了并发库,我们也可以看看.net 4 beta已经发布了 ,我们可以看一下它在发布之后迁移到.net 4。 目前服务器有.Net 2,我已提交审核升级到我的开发盒所具有的.net 3.5 SP1。 谢谢 更新 我刚刚尝试了Parallel.For实现,但它提出了一些奇怪的结果。 单线程: IRandomGenerator rnd = new MersenneTwister(); IDistribution dist = new […]

在高性能套接字上使用Async-Await vs ThreadPool与MultiThreading(C10k解决方案?)

我真的很困惑async-await s, pool s和thread s。 主要问题始于这个问题:“当我必须处理10k插槽I / O时,我该怎么办?” (又名C10k问题 )。 首先,我尝试使用一个使用一个主Queue和多个Thread来处理所有传入数据的线程来创建一个自定义池架构。 这是了解thread-safety和multi-threading thread-safety一个很好的经验,但是thread对于现在的async-await是一种过度杀伤力 。 后来,我使用async-await实现了一个简单的架构,但我无法理解为什么“async和await关键字不会导致创建额外的线程。” ( 来自MSDN )? 我认为必须有一些thread来做像BackgroundWorker这样的工作。 最后,我使用ThreadPool实现了另一个架构,它看起来像我的第一个自定义池。 现在,我认为我应该有其他人对处理C10k感到困惑。 我的项目是我的游戏项目的专用(中央)服务器,它是集线器/大厅服务器,如MCSG的大厅或COD的配对服务器。 我将进行登录操作,游戏服务器命令执行/查询和服务信息(如版本,补丁)。 最后一部分可能对我的项目更具体,但我真的需要一些关于多个(重)数据处理的现实解决方案的好建议。 (也就是说,1k-10k-100k连接处理取决于服务器硬件,但这是一般性问题) 关键点: 在任务并行库和ThreadPool之间选择 (MSDN博客) [附加]想要了解我们在谈论什么的好(基本)事物: 主题 异步,等待 线程池 的BackgroundWorker

你如何获得C#中运行线程的列表?

我在C#中创建动态线程,我需要获取那些运行线程的状态。 List[] list; list = dbConnect.Select(); for (int i = 0; i { sendMessage(list[0][‘1’]); //calling callback function }); th.Name = “SID”+i; th.Start(); } for (int i = 0; i < list[0].Count; i++) { // here how can i get list of running thread here. } 如何获得正在运行的线程列表?

如何以某种优先级调用方法异步?

我需要以不同的优先级异步调用几个方法。 我的第一个想法是使用ThreadPool并更改Thread的优先级,如下所示: static void Run() { ThreadPool.QueueUserWorkItem(new WaitCallback(SomeMethod)); } static void SomeMethod(object o) { Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; // is this ok? // do some work here } 这有用吗或你推荐什么?

如何获得第二个System.Thread.ThreadPool?

如果我以嵌套的方式使用ThreadPool,我的应用程序会挂起: ThreadPool.QueueUserWorkItem((state) => ThreadPool.QueueUserWorkItem(Action)); 如何获得第二个独立的ThreadPool来实现嵌套?

WaitHandle.WaitAll上的NotSupportedException

我正在尝试执行以下代码。 代码尝试并行下载和保存图像。 我传递了要下载的图像列表。 我在C#3.0中编写了这个,并使用.NET Framework 4(VS.NET express edition)进行编译。 每次我尝试运行我的程序时,WaitAll操作都会导致NotSupportedException(不支持STA线程上的多个句柄的WaitAlll) 。 我尝试删除SetMaxThreads ,但这没有任何区别。 public static void SpawnThreads(List imageList){ imageList = new List(imageList); ManualResetEvent[] doneEvents = new ManualResetEvent[imageList.Count]; PicDownloader[] picDownloaders = new PicDownloader[imageList.Count]; ThreadPool.SetMaxThreads(MaxThreadCount, MaxThreadCount); for (int i = 0; i < imageList.Count; i++) { doneEvents[i] = new ManualResetEvent(false); PicDownloader p = new PicDownloader(imageList[i], doneEvents[i]); picDownloaders[i] = […]

ThreadPool.QueueUserWorkItem的意外行为

请查看下面的代码示例: public class Sample { public int counter { get; set; } public string ID; public void RunCount() { for (int i = 0; i < counter; i++) { Thread.Sleep(1000); Console.WriteLine(this.ID + " : " + i.ToString()); } } } class Test { static void Main() { Sample[] arrSample = new Sample[4]; for (int i […]

如何确定ThreadPool队列中的项目数

我正在使用ThreadPool来排队1000个工作项 While(reading in data for processing) { args = some data that has been read; ThreadPool.QueueUserWorkItem(new WaitCallback(threadRunner), args); } 然而,这非常有效,因为主线程将请求排队的速度比处理内存的速度慢得多。 我希望做一些类似于以下内容的事情,以便在队列增长时限制排队 Thread.Sleep(numberOfItemsCurrentlyQueued); 随着队列的增长,这会导致更长的等待时间。 有没有办法发现队列中有多少项?

检测ThreadPool WorkItem是否已完成/等待完成

无论出于何种原因, ThreadPool的QueueWorkItem不会返回IAsyncResult或工作项的其他句柄,这将允许等到它完成。 有RegisterWait…方法,但是你必须传递一个WaitHandle并且创建它们很昂贵(参见IAsyncResult文档,它建议你在请求之前延迟创建WaitHandle )。 任务并行库将解决这个缺陷,但在可用之前需要等待很长时间。 那么,这个设计有什么问题: public class Concurrent { private ManualResetEvent _resetEvent; private T _result; public Concurrent(Func f) { ThreadPool.QueueUserWorkItem(_ => { _result = f(); if (_resetEvent != null) _resetEvent.Set(); }); } public WaitHandle WaitHandle { get { if (_resetEvent == null) _resetEvent = new ManualResetEvent(_result != null); return _resetEvent; } … 编辑:我问了一个关于使用异步委托而不是ThreadPool时出现的问题的后续问题 。