Вызов BeginInvoke (или Invoke) ничего не купит, если только функция обработки чисел не выполняется в потоке пользовательского интерфейса.
Рассмотрим следующий код:
private void HardWork(object state)
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(500);
SetText(i.ToString());
}
}
private void SetText(string text)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<string>(SetText), text);
}
else
{
textBox1.Text = text;
}
}
private void Button_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(HardWork);
}
Метод Button_Click
начнет выполнение метода HardWork
в отдельном потоке. HardWork выполнит некоторую обработку (смоделированную с помощью вызова Thread.Sleep
), а затем вызовет метод для отображения некоторого прогресса. Внутри этого метода нам нужно проверить, находимся ли мы в потоке пользовательского интерфейса или нет. Если это не так, мы вызываем тот же метод, используя Invoke
(или BeginInvoke
), чтобы заставить его выполняться в потоке пользовательского интерфейса.
Обновление: если объем данных, генерируемых методом перебора чисел, очень велик, это, конечно, может негативно повлиять на скорость отклика пользовательского интерфейса. Например, если вы накапливаете большой объем текста в поточном методе и генерируете этот текст при каждом обновлении, это будет медленнее, чем просто вывод того, что изменилось с момента последнего обновления. То же самое касается текстового поля; вызов TextBox.AppendText только с новым текстом будет быстрее, чем повторное присвоение свойства TextBox.Text.
Трудно дать более подробные идеи о том, как решить вашу конкретную проблему, поскольку мы не видим, что на самом деле делает ваш код.