void m_parsingWorker_DoWork(object sender, DoWorkEventArgs e) { // THREADING DANGER ZONE! UICulture.Initialize(); var worker = (BackgroundWorker)sender; var protocol = m_currentProtocol; int turnOffTimes = 0; while (!worker.CancellationPending) { ViewerItem item = null; lock (m_parsingQueue) { if (m_parsingQueue.Count > 0) { item = m_parsingQueue.Dequeue(); } } if (item == null) { ++turnOffTimes; if (turnOffTimes == 50) { return; } Thread.Sleep(100); continue; } if (item.Viewer != this || item.Log != m_currentLog) { continue; } var parser = item.Parser; if (parser == null) { turnOffTimes = 0; protocol.CreateParser(item); parser = item.Parser; } if (!parser.IsParsed) { turnOffTimes = 0; parser.Parse(); } } }