我怎样才能检查我是否在线程中捕获异常?

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()移动到包装纸上,这符合您的口味。

以上是关于我怎样才能检查我是否在线程中捕获异常?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能让 QtCreator 打破异常?

如何捕获 devenv 异常

在代码中捕获异常

C#如何捕获异常并检查它是否包含字符串?

从另一个线程捕获异常

捕获空指针异常是代码异味吗?