方法如下:
lblStatus.Text = "执行中,请稍候……";
FunclongTask = new Func (delegate()
{
// 模拟长时间任务
Thread.Sleep(2000);
// 返回任务结果:5
return 5;
});
// 发起一次异步调用,实际上就是在.net线程池中执行longTask
// 这时由于是其它线程在工作,UI线程未被阻塞,所以窗体不会假死
longTask.BeginInvoke(ar =>
{
// 使用EndInvoke获取到任务结果(5)
int result = longTask.EndInvoke(ar);
// 使用Control.Invoke方法将5显示到一个label上,如果没有Invoke,
// 直接写lblStatus.Text="5",将会抛出跨线程访问UI控件的异常
Invoke(new Action(() => lblStatus.Text = "执行结果是:" + result));
}, null);