Доброго времени суток.
Прошу не судить строго, если вопрос покажется глупым, опыта пока маловато...
WinForms, C#. dll-ка (не моя) создаёт потоки (до 50 штук в секунду) в которых вызывает callback-функцию в моём коде и передаёт ей данные. Задача обработать эти данные в основном потоке.
Мысль первая: в callback'е помещать эти данные в очередь и по срабатыванию System.Windows.Forms.Timer (думаю где-то 20мс поставить интервал) проверять очередь и обрабатывать что там накопилось. Не очень нравится что таймер будет всё время крутиться, потому что нашествия потоков случаются время от времени.
Мысль вторая: также с очередью, но создать BackgroundWorker и его DoWork в бесконечном цикле останавливать на EventWaitHandle и по мере поступления данных пропускать его исполнение и создавать событие ProgressChanged в обработчике которого и разбирать данные:
class test
{
EventWaitHandle wh = new AutoResetEvent(false);
private BackgroundWorker backgroundWorker1 = new BackgroundWorker();
object locker = new object();
Queue<string> tasks = new Queue<string>();
public test()
{
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.DoWork +=
new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.ProgressChanged +=
new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
backgroundWorker1.RunWorkerAsync();
}
void Callback(String data)
{
lock (locker)
{
tasks.Enqueue(data);
wh.Set();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
lock (locker)
{
if (tasks.Count > 0)
{
backgroundWorker1.ReportProgress(0);
}
}
wh.WaitOne();
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lock (locker)
{
if (LogWindow.Instance.InvokeRequired)
{
}
while (tasks.Count > 0)
{
parseNewData(tasks.Dequeue());
}
}
}
}
Я не знаю как BackgroundWorker проверяет изменение прогресса, если в том же таймере, то конечно мысль глупая. Вообщем посоветуйте как лучше?