C# 线程进程在执行完整代码之前退出

C# 线程进程在执行完整代码之前退出,c#,C#,我有下面的代码,它应该为string[]文件中的每个文件分配线程工作线程,以在try-catch块中的ProcessFile中执行代码 然而,大多数情况下,ProcessFile中的代码没有到达抛出我想要检查的异常的主函数。我注意到调试时的行为,因为在执行ProcessFile中的所有代码之前,执行语句一直在Main和ProcessFile之间跳跃。我假设这是因为工作线程在完成程序之前退出。我不知道该怎么办 静态int工作计数器=0; 静态int工作极限=1000; 静态int processe

我有下面的代码,它应该为string[]文件中的每个文件分配线程工作线程,以在try-catch块中的ProcessFile中执行代码


然而,大多数情况下,ProcessFile中的代码没有到达抛出我想要检查的异常的主函数。我注意到调试时的行为,因为在执行ProcessFile中的所有代码之前,执行语句一直在Main和ProcessFile之间跳跃。我假设这是因为工作线程在完成程序之前退出。我不知道该怎么办

静态int工作计数器=0; 静态int工作极限=1000; 静态int processedCounter=0; 静态空隙总管{ string[]files=目录。GetFiles@DirectoryPath; int checkCount=files.Length; 文件中的foreach字符串文件{ //等待自由限制。。。 工作时计数器>=工作极限{ 线程100; } 工作计数器+=1; ParameterizedThreadStart pts=新的ParameterizedThreadStartProcess文件; 螺纹th=新螺纹pts; 启动文件; } //等待所有线程完成。。。 处理时计数器<校验计数{ 线程100; } Console.WriteLineWork已完成!; } 静态无效ProcessFileobject文件{ 试一试{ 字符串路径=file.ToString; Console.WriteLine\n\n+DateTime.Now.ToString+Received:+file+线程计数为:+workingCounter.ToString; //为演示做一些睡眠。。。 CSVBOM测试=新的CSVBOMpath,CSVBOM.BOMFileType.csv; 测试.FindHeaderRowpath; testing.getIndexAppath; testing.HeaderColumnParserpath; 测试.SeparateIntFromString; Thread.Sleep2000; } 捕获异常{ //处理您的异常。。。 捕获到Console.WriteLineException:{0}\n文件{1},例如消息,文件; } 最后{ 联锁。工作计数器递减; 联锁。递增REF处理计数器; } }
在不评论更好的设计的情况下,您需要修复任何竞争条件,并告诉编译器一个变量

首先修复声明:

static volatile int workingCounter = 0;
const int workingLimit = 1000;
static volatile int processedCounter = 0;
下一步修复任何竞争条件。workingCounter+=1与workingCounter=workingCounter+1相同。这可能说明了为什么这不是线程安全的

//Not thread safe
workingCounter  += 1;
应该是:

Interlocked.Increment(ref workingCounter);

在不评论更好的设计的情况下,您需要修复任何竞争条件,并告诉编译器一个变量

首先修复声明:

static volatile int workingCounter = 0;
const int workingLimit = 1000;
static volatile int processedCounter = 0;
下一步修复任何竞争条件。workingCounter+=1与workingCounter=workingCounter+1相同。这可能说明了为什么这不是线程安全的

//Not thread safe
workingCounter  += 1;
应该是:

Interlocked.Increment(ref workingCounter);

您运行的是哪个版本的c和.net?除非您正在具体研究线程和同步化,否则您会考虑将代码移到任务中吗?我注意到调试时的行为,因为执行语句在Main和ProcessFile之间不断跳转:调试多线程应用程序时这是正常的。别忘了你的主程序也是一个线程!我正在运行.Net 2.0,无法更改它。我试图实现的是针对150个文件测试我开发的代码,以查看捕获到的任何异常。即使不使用任务,也应该查看信号量类。它将用一个做同样事情的逻辑抽象来代替你的workingCounter和线程休眠;不是线程安全的-您应该使用Interlocked.Increment来实现它。您运行的是哪个版本的c和.net?除非您正在具体研究线程和同步化,否则您会考虑将代码移到任务中吗?我注意到调试时的行为,因为执行语句在Main和ProcessFile之间不断跳转:调试多线程应用程序时这是正常的。别忘了你的主程序也是一个线程!我正在运行.Net 2.0,无法更改它。我试图实现的是针对150个文件测试我开发的代码,以查看捕获到的任何异常。即使不使用任务,也应该查看信号量类。它将用一个做同样事情的逻辑抽象来代替你的workingCounter和线程休眠;不是线程安全的-应该使用Interlocked.Increment。