Странное поведение в теме - PullRequest
0 голосов
/ 08 ноября 2019

Я использую Linq для создания новых потоков в цикле и запуска их, а затем присоединяюсь к потокам в следующем цикле. Тем не менее, первый цикл выдает исключение, с которым я очень смущен, прежде чем я могу даже присоединиться к потокам. Я получаю индекс вне диапазона исключений, и я = 3, хотя indexOfHeaders имеет только 3 элемента (с индексами 0,1,2). Но что еще более странно, так это то, что я не могу увидеть значение int numberOfThreads, когда разбиваю исключение в отладчике, даже если все остальные локальные переменные видны. Это потому, что я неправильно использую linq или тернарный оператор? Ничто из этого не воспроизводится, когда я медленно выполняю код в отладчике.

private static void DecodeFileData(byte[] dataBuffer, UInt64 header, UInt64 trailer)
{
    byte[] headerBytesReceive = BitConverter.GetBytes(header);
    byte[] trailerBytesReceive = BitConverter.GetBytes(trailer);
    IEnumerable<int> indexOfHeaders = StartingIndex(dataBuffer, headerBytesReceive); //int indexOfHeader = Array.IndexOf(HundredKBBuffer, headerBytesReceive);
    // spawn up to 10 threads that look at the byte array for the right data
    SerialTest.DataFileWriter fileWriter = new SerialTest.DataFileWriter();
    int numberOfThreads = indexOfHeaders.Count() < 10 ? indexOfHeaders.Count() : 10;
    List<Thread> threadList = new List<Thread>();
    for (int i = 0; i < numberOfThreads; i++)
    {
        Thread decodeThread = new Thread(() => DecodeDataAsync(dataBuffer, headerBytesReceive, trailerBytesReceive, indexOfHeaders.ElementAt(i), fileWriter));
        threadList.Add(decodeThread);
        decodeThread.Start();
    }
    for (int i = 0; i < threadList.Count; i++)
        threadList.ElementAt(i).Join();
}

public static void DecodeDataAsync(byte[] dataBuffer, byte[] headerBytesReceive, byte[] trailerBytesReceive, int indexOfHeader, SerialTest.DataFileWriter fileWriter)
{ //lots of file writing and stuff that is irrelevent

DecodeFileData вызывается синхронно из другого метода. DecodeDataAsync является асинхронным, как вы можете видеть из моего опубликованного кода.

1 Ответ

2 голосов
/ 08 ноября 2019

2 вещей, с которыми вам нужно быть осторожными:

Во-первых, вы передаете общие состояния:

byte[] dataBuffer, byte[] headerBytesReceive, byte[] trailerBytesReceive, int indexOfHeader, SerialTest.DataFileWriter fileWriter

Во-вторых, переменная i равна НЕ локальный по отношению к потоку.

DecodeDataAsync(dataBuffer, headerBytesReceive, trailerBytesReceive, indexOfHeaders.ElementAt(i), fileWriter));

Создайте функцию Wrapper, чтобы скопировать ее в локальную переменную и передать в поток.

...