110,538
社区成员
发帖
与我相关
我的任务
分享
( new System.Threading.Thread( () =>
{
Action();
this.BeginInvoke();
} ) ).Start();
control.Invoke((Action)delegate
{
模态对话框;
继续处理;
异步处理;
});
这类代码。
也就是说你的 action 首先是支持非 UI 线程,那么你就能在这里放心地使用 action。而假设你吊用别人的“库”代码并不支持非 UI 线程,那么就不得不把它整体放到主线程去执行,那么只好整体“怪他咯”。没有别的办法。
比如说以前我们在 c# 中经常要调用 Excel 来出一些东西,但是我们发现任何调用代码都要在 UI 线程来调用,哪怕仅仅是调用它做个生产资源规划计算, 或者仅仅是保存一下处理结果到文件,没有界面要求,也必须在 UI 线程来调用。
那么这就得这么调用。如果在子线程调用它,代码会“卡死”甚至出现各种各样的意外的崩溃。[/quote]首先谢谢回答,现在就是遇到这种问题,从现象上看,应该属于你说的不支持非UI线程调用,因为要做自动调用且不阻塞界面,所以才这样做,也许该和客户沟通下这个功能无法实现,毕竟第三方库是他们找人提供的,另外你提到的Excel的问题,最后是解决了多线程还是仍然用主线程执行?想看方法control.Invoke(....)
方式执行,那么你在子线程中调用 action,你的 UI 主线程也会被阻塞,并不会产生你说的“而实际上表现出来的又没有模态”这个现象。那么这个时候你就不存在这个担心了。
所以这个担心,前提是“第三方库”首先就跟 .net 不完全兼容。这时候你要决定敢不敢在子线程中调用它,就要看测试来定。control.Invoke((Action)delegate
{
模态对话框;
继续处理;
异步处理;
});
这类代码。
也就是说你的 action 首先是支持非 UI 线程,那么你就能在这里放心地使用 action。而假设你吊用别人的“库”代码并不支持非 UI 线程,那么就不得不把它整体放到主线程去执行,那么只好整体“怪他咯”。没有别的办法。
比如说以前我们在 c# 中经常要调用 Excel 来出一些东西,但是我们发现任何调用代码都要在 UI 线程来调用,哪怕仅仅是调用它做个生产资源规划计算, 或者仅仅是保存一下处理结果到文件,没有界面要求,也必须在 UI 线程来调用。
那么这就得这么调用。如果在子线程调用它,代码会“卡死”甚至出现各种各样的意外的崩溃。this.BeginInvoke();
这句话如果this代表的是一个窗体或者控件的话,实际上这句话是让ui线程去操作传入的委托。因此如果传入的方法卡住,ui线程自然就会卡住,界面也就会卡住。
我猜是这样。