簡體   English   中英

如何檢查我是否在線程中捕獲異常?

[英]How can i check if i catch a exception in thread?

我有一個運行線程的抽象類:

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

如您所見,當我捕獲到異常時,我會更改變量的值,但是它將起作用嗎? 我不知道如何檢查。

更好的答案可能不是使用Threads,而是使用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()移到包裝器,以達到您的口味。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM