如何检查我是否在线程中捕获异常?

时间:2019-03-01 08:42:04

标签: c# .net multithreading exception

我有一个运行线程的抽象类:

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;
    }
}

如您所见,当我捕获到异常时,我会更改变量的值,但是它将起作用吗?我不知道如何检查。

1 个答案:

答案 0 :(得分:1)

更好的答案可能是不使用线程,而使用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()移到包装纸上,以达到您的口味。