Как я могу проверить, поймал ли я исключение в потоке? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть абстрактный класс, который запускает потоки:

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 голосов
/ 01 марта 2019

Лучшим ответом, вероятно, является не использование потоков, а использование 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() на обертку, по вашему вкусу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...