调用 BeginInvoke(或 Invoke)不会给您带来任何好处,除非数字运算函数在 UI 线程之外的另一个线程上运行。
考虑以下代码:
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
调用模拟)然后调用一个方法来显示一些进度。在这个方法中,我们需要检查我们是否在 UI 线程上。如果不是,我们使用Invoke
(or BeginInvoke
) 调用相同的方法,以强制它在 UI 线程上执行。
更新:如果数字运算方法发出的数据量非常大,这当然可能会对 UI 响应性产生负面影响。例如,如果您在线程方法中累积大量文本并在每次更新时发出该文本,那么这将比仅发出自上次更新以来发生的变化要慢。文本框也是如此;仅使用新文本调用 TextBox.AppendText 将比重复分配 TextBox.Text 属性更快。
很难就如何解决您的特定问题给出更详细的想法,因为我们还没有看到您的代码实际做了什么。