我怎样才能检查我是否在线程中捕获异常?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我怎样才能检查我是否在线程中捕获异常?相关的知识,希望对你有一定的参考价值。
我有一个运行线程的抽象类:
protected volatile bool HasError = false;
public void Run()
{
var readingThread = new Thread(ReadInFile);
var compressingThreads = new List<Thread>();
for (var i = 0; i < Environment.ProcessorCount; i++)
{
var j = i;
ProcessEvents[j] = new AutoResetEvent(false);
compressingThreads.Add(new Thread(() => Process(j)));
}
var writingThread = new Thread(WriteOutFile);
readingThread.Start();
foreach (var compressThread in compressingThreads)
{
compressThread.Start();
}
writingThread.Start();
WaitHandle.WaitAll(ProcessEvents);
OutputDictionary.SetCompleted();
writingThread.Join();
Console.WriteLine(!HasError ? "Successfully competed" : "Error");
}
好吧,我不知道如何查看例外情况?这是类实现抽象类。这是一种方法:
protected override void Process(int processEventId)
{
try
{
while (InputQueue.Dequeue(out Chunk chunk) && !HasError)
{
var compressedChunk = GZip.GZip.CompressByBlocks(chunk.Bytes);
OutputDictionary.Add(chunk.Id, compressedChunk);
}
ProcessEvents[processEventId].Set();
}
catch (Exception e)
{
HasError = true;
}
}
正如您所看到的,当我捕获异常时,我会更改变量的值,但是它会起作用吗?我不明白怎么检查。
答案
更好的答案可能不是使用线程但使用Parallel.For()
,它可以管理您的错误,并且还有更好的处理工作负载的选项。
但是在当前的设置中,只需添加一个包装器方法:
var j = i;
ProcessEvents[j] = new AutoResetEvent(false);
compressingThreads.Add(new Thread(() => SafeCallProcess(j) ));
和
private void SafeCallProcess(int j)
{
try
{
Process (j);
}
catch(Exception e)
{
// deal with it
}
}
您也可以将Set()
移动到包装纸上,这符合您的口味。
以上是关于我怎样才能检查我是否在线程中捕获异常?的主要内容,如果未能解决你的问题,请参考以下文章