C#异步调用,界面假死

2025-05-18 05:27:07
推荐回答(1个)
回答(1):

方法如下:
lblStatus.Text = "执行中,请稍候……";
 
Func longTask = 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);