Я читаю и декодирую двоичный файл, побайтово. Для этого я использую два BackgroundWorker
s: один для чтения файла, который производит List<byte>
переменного размера для каждой «строки» моего файла, и один для обработки «строк».
Поскольку я хочу, чтобы они запускались в parralel, и я не знаю, какой из них будет быстрее другого, я использую Queue
для передачи данных между двумя BackgroundWorker
с.
Вот в чем дело: ни один из List<byte>
не должен содержать значение 0
в любой момент. Я проверяю, что перед добавлением их в очередь. Тем не менее, на другом конце Queue
некоторые списки содержат значения 0
. Тем не менее, я создаю новый List<byte>
при каждом вызове Dequeue()
, поскольку, по-видимому, если я этого не сделаю, данные будут изменены до завершения обработки.
Я пытался вручную создать новый объект List<byte>
и , а затем , присвоив ему результат Dequeue()
, без улучшений. я впервые работаю с Queue
, и, поскольку мой код многопоточный, шаг за шагом почти невозможно отладить.
Queue<List<byte>> q = new Queue<List<byte>>(); // My FIFO queue
// Reading thread
private void BackgroudWorkerRead_DoWork(object sender, DoWorkEventArgs e)
{
// ... read the file
List<byte> line_list = new List<byte>();
// ... filling line_list with data
// in this part I check that no byte added to line_list has the value 0, or else I display an errror message and end the process
q.Enqueue(line_list);
if (!backgroundWorkerNewLine.IsBusy) backgroundWorkerNewLine.RunWorkerAsync(); // if the other BackgroundWorker isn't processing data, now it needs to since we just added some to the queue
}
// Processing thread
private void backgroundWorkerNewLine_DoWork(object sender, DoWorkEventArgs e)
{
while (q.Count > 0) // While there is data to process
{
string line_str = DecodeBytes(new List<byte>(q.Dequeue())); // Decoding
string[] elements = line_str.Split(separator, StringSplitOptions.None); // Separating values
Form1.ActiveForm.Invoke(new MethodInvoker(() => AddRow(elements))); // Add the line to a DataTable from the main thread
}
}
public string DecodeBytes(List<byte> line)
{
/// ... read each byte and return a string of the whole decoded line
}
public void AddRow(string[] el)
{
MyDataTable.Rows.Add(el);
}
Кажется, что список, возвращаемый q.Dequeue (), не возвращает те же данные, которые были добавлены q.Enqueue ()