Tag: multithreading线程

强制ThreadPool更快地启动线程

我使用ThreadPool.QueueUserWorkItem在Windows CE上创建一个线程(我使用.NET Framework 3.5)。 有时线程会等待某些事情并且开始得太晚。 在QueueUserWorkItem文档中,它表示代理将在“线程池线程可用时”执行。 有没有办法强制ThreadPool立即执行我的委托? Thread.Start()会成为一个解决方案吗? 谢谢!

.NET中的线程池和.IsBackground

MSDN以及许多其他来源声称线程池中的工作线程始终是后台。 “线程池线程是后台线程。” (MSDN) “汇集的线程总是后台线程。” (在C#中穿线,Joseph Albahari) 我可以通过设置轻松地使工作线程非背景 Thread.CurrentThread.IsBackground = false; 应用程序将等待线程完成。 这有什么问题?

限制线程池线程的数量

我在我的应用程序中使用ThreadPool 。 我首先使用以下命令设置线程池的限制: ThreadPool.SetMaxThreads(m_iThreadPoolLimit,m_iThreadPoolLimit); m_Events = new ManualResetEvent(false); 然后我使用以下内容排队 WaitCallback objWcb = new WaitCallback(abc); ThreadPool.QueueUserWorkItem(objWcb, m_objThreadData); 这里abc是我调用的函数的名称。 在此之后,我正在执行以下操作,以便我的所有线程都达到1点,主线程接管并继续进行 m_Events.WaitOne(); 我的线程限制是3.我遇到的问题是,尽管线程池限制设置为3,我的应用程序同时处理3个以上的文件,而它一次只能处理3个文件。 请帮我解决这个问题。

进程优先级和线程池优先级之间的任何关系(C#)

我知道线程池优先级应该/不能被正在运行的进程更改,但是在线程池上运行的特定任务的优先级是否与调用进程优先级有些相关? 换句话说,无论调用进程优先级如何,线程池中的所有任务都以相同的优先级运行? 谢谢 更新1:我应该更具体,我引用Parallel.ForEach中的线程

MsgWaitForMultipleObjects的C#等价物是什么?

我在报告模式下有一个带有ListView的Windows窗体。 对于视图中的每个项目,我需要执行一个长时间运行的操作,其结果是一个数字。 我在本机win32中这样做的方法是为每个项创建一个工作线程(天真地;当然我不会创建无限数量的线程),然后在线程句柄数组上创建MsgWaitForMultipleObjects()。 当每个计算完成时,线程信号和主UI线程唤醒并更新。 同时,我们抽取消息,以便UI线程保持响应。 任何人都可以提供一个如何在C#中工作的例子吗? 我看过Monitor对象,它似乎不是我想要的 – 或者是否在阻塞时抽取消息? 谢谢。 编辑:似乎WaitHandler.WaitAny()可能实际上是在发送消息。 请参阅cbrumme关于 CLR中消息抽取的论文 。

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

我有这个应用程序将递归给定目录中的所有文件夹并查找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[] […]

你如何获得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. } 如何获得正在运行的线程列表?

如何获得第二个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队列中的项目数

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