c# 线程中执行委托耗时操作怎么防止界面假死?

如图代码,这个委托是我在线程执行的,但是成功标志位false,我界面会一直假死。虽然成功阻塞了下面程序的运行,但是用户体验很差。请问有什么办法,能够在验证标志位的同事,还... 如图代码,这个委托是我在线程执行的,但是成功标志位false,我界面会一直假死。虽然成功阻塞了下面程序的运行,但是用户体验很差。请问有什么办法,能够在验证标志位的同事,还能阻碍程序往下执行? 展开
 我来答
中二麟7500
2019-12-28 · TA获得超过1.2万个赞
知道大有可为答主
回答量:1.1万
采纳率:83%
帮助的人:378万
展开全部
在调用线程之前,打开自定义的进度条控件。之后再线程委托里边操作界面上的多个控件,导致进度条和界面卡死。//打开进度条 progressBar = new ProgressShow("初始化数据请稍候...");
progressBar.Show();//线程System.Threading.Thread treed3 = new System.Threading.Thread(new System.Threading.ThreadStart(mytest));
treed3.Start();
while (treed3.ThreadState == System.Threading.ThreadState.Running){Application.DoEvents();
}//关闭进度条
progressBar.Close();///
private void mytest(){try{ delegate void delInfo();
delInfo MyDelInfo = new delInfo(newThreadInfo); this.Invoke(MyDelInfo);// (new delInfo(newThreadInfo)); } newThreadInfo中操作多个界面控件}catch (Exception ex){progressBar.Close();
百度网友eb6ab18
2019-12-28 · TA获得超过584个赞
知道小有建树答主
回答量:1068
采纳率:83%
帮助的人:247万
展开全部
如果界面无响应,说明你的代码一直是在UI线程进行的,在执行结束以前,UI线程做不了别的事,自然就会无响应。
如果你确定是你的LoadingHandle执行时间过长,那你可以把它放到后台线程中去完成:
await Task.Run(YourAsyncMassion);

后面是你更新UI的代码。
追问
但是这个委托我是放在线程里执行的呀,而且使用的是BeginInvoke,里面放的也不是ui代码。
追答
没有看出来你的委托在后台线程运行的迹象,你给Loading.LoadingHandle传递了一个很大的Lamda表达式(实质也就是委托),但是这不代表Loading.LoadingHandle会在后台线程运行这个委托。BeginInvoke是调用委托的方法,和在不在后台线程也没有任何关系。你的理解有误,建议你查阅一下Loading.LoadingHandle有没有接受异步方法(委托)的重载,这样你就可以传一个异步委托进去:
Loading.LoadingHandle(async () => wait ...);
这样工作就会在后台进行,完成后会返回UI线程。UI线程不会阻塞。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式