Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的线程池会被卡住,除非在WaitHandle之前放置MessageBox?_C#_.net_Multithreading_Command Line_Threadpool - Fatal编程技术网

C# 为什么我的线程池会被卡住,除非在WaitHandle之前放置MessageBox?

C# 为什么我的线程池会被卡住,除非在WaitHandle之前放置MessageBox?,c#,.net,multithreading,command-line,threadpool,C#,.net,Multithreading,Command Line,Threadpool,我创建的线程池将启动,但如果在打开.exe文件或从命令行执行它时从complete启动,则不会完成,只有在运行调试器时,它才会完全运行 我已经编写了WinForms程序来创建一个包含两个线程的线程池,并等待线程完成后结束程序 我编写它是为了从命令行启动.exe并接受参数,但我遇到的问题是线程启动,但由于某种原因,在WaitHandle.WaitAll()之前会被卡住,除非它与调试器一起运行。我注意到的一件事是,当我将MessageBox放在WaitHandle之前时,它将完成,但我需要程序在后台

我创建的线程池将启动,但如果在打开.exe文件或从命令行执行它时从complete启动,则不会完成,只有在运行调试器时,它才会完全运行

我已经编写了WinForms程序来创建一个包含两个线程的线程池,并等待线程完成后结束程序

我编写它是为了从命令行启动.exe并接受参数,但我遇到的问题是线程启动,但由于某种原因,在WaitHandle.WaitAll()之前会被卡住,除非它与调试器一起运行。我注意到的一件事是,当我将MessageBox放在WaitHandle之前时,它将完成,但我需要程序在后台运行,而不需要任何MessageBox

eventArray = new AutoResetEvent[2];
eventArray[0] = new AutoResetEvent(false);
eventArray[1] = new AutoResetEvent(false);

ThreadPool.QueueUserWorkItem(new WaitCallback(o =>
{
errors000 = Process000Or001(table, "000", eventArray[0], logFile835, batchID);
}), eventArray[0]);


ThreadPool.QueueUserWorkItem(new WaitCallback(o =>
{
errors001 = Process835Or837(table, "001", eventArray[1], logFile837, batchID);
}), eventArray[1]);

//MessageBox.Show("");

WaitHandle.WaitAll(eventArray);

//program wraps up

我没有收到任何错误消息,我已经为两个线程创建了日志,当我从命令行执行时,我看到它会写入日志中的第一行,但它只会在我需要10-12行时写入该行。我甚至看到程序在任务管理器中运行,但它似乎被卡住了。

听起来你的信令EVET没有设置,所以
WaitAll
只是等待。我在返回值之前的方法末尾有一个
.set()
,所以应该设置它。在使用调试器运行时,它也会完成。创建了一个虚拟应用程序,在其中我将yout
errors=..
替换为just
eventArray[0]。Set()
(对于其他回调中的其他事件也是如此)。它在调试和发布模式下都能正常工作。你能确认一下吗?行,但我需要那条线?这是我正在编写的程序的主要方法……无论哪种方法,我都会自动打开和关闭一个消息框。