Существует два основных подхода, которые вы можете использовать. Выберите тот, который имеет наибольший смысл в вашей ситуации. Часто нет правильного или неправильного выбора. Они могут работать одинаково хорошо во многих ситуациях. У каждого свои преимущества и недостатки. Как ни странно, сообщество, похоже, слишком часто пропускает метод pull. Я не уверен, почему это так. Я недавно наткнулся на вопрос this, в котором каждый рекомедовал подход «подталкивания», несмотря на то, что он был идеальной ситуацией для метода выталкивания (была одна бедная душа, которая шла против стада и забиралась вниз и, в конце концов, удаляла свой ответ, оставив только меня в качестве одиночного диссидента).
Нажмите Метод
Есть рабочий поток передать данные в форму. Для этого вам понадобится метод ISynchronizeInvoke.Invoke
. Преимущество состоит в том, что по мере поступления каждого элемента данных он будет немедленно добавлен в сетку. Недостаток заключается в том, что вам нужно использовать дорогостоящую операцию маршалинга, и пользовательский интерфейс может загореться, если рабочий поток слишком быстро получает данные.
void WorkerThread()
{
while (true)
{
object data = GetNewData();
yourForm.Invoke(
(Action)(() =>
{
// Add data to your grid here.
}));
}
}
Прицепного Метод
Есть поток пользовательского интерфейса вытащить данные из рабочего потока. У вас будет рабочий поток, в который вносятся новые элементы данных в общую очередь, а поток пользовательского интерфейса будет периодически деактивировать элементы. Преимущество в том, что вы можете дросселировать объем работы, каждый поток выполняет независимо. Очередь - это ваш буфер, который будет уменьшаться и увеличиваться по мере того, как потребление ресурсов и потоки процессора. Он также отделяет логику рабочего потока от потока пользовательского интерфейса. Недостаток заключается в том, что если ваш поток пользовательского интерфейса не будет опробовать достаточно быстро или продолжит рабочий поток, он может перегрузить очередь. И, конечно, элементы данных не появятся в реальном времени в вашей сетке. Однако, если вы установите интервал System.Windows.Forms.Timer
достаточно коротким, чтобы не быть проблемой для вас.
private Queue<object> m_Data = new Queue<object>();
private void YourTimer_Tick(object sender, EventArgs args)
{
lock (m_Data)
{
while (m_Data.Count > 0)
{
object data = m_Data.Dequeue();
// Add data to your grid here.
}
}
}
void WorkerThread()
{
while (true)
{
object data = GetNewData();
lock (m_Data)
{
m_Data.Enqueue(data);
}
}
}
Мы говорим о WinForms или WPF? – Arcturus
@Arcturus - WinForms –
Это .Net 4 или более ранняя версия? – Ragoczy