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

问题描述 投票:0回答:1

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

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

正如您所看到的,当我捕获异常时,我会更改变量的值,但是它会起作用吗?我不明白怎么检查。

c# .net multithreading exception
1个回答
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()移动到包装纸上,这符合您的口味。

© www.soinside.com 2019 - 2024. All rights reserved.