2 zdl543 zdl543 于 2016.01.20 00:21 提问

C# click事件 多线程 异步 耗时 操作UI

listbox做了个目录(单层),点击一条就在另一个控件加载相应的内容。这个加载过程是耗时操作。
所以考虑用异步,在click处理函数里开了子线程。因为需要操作UI,所以在子线程里调用invoke,但是无论使用invoke还是beginInvoke,那个加载内容的函数都是在UI线程上执行。这样就会造成UI线程阻塞。
想实现的效果是,一次点击之后马上能响应下一次点击同时把上一次点击的加载线程结束掉而执行当前点击的加载线程。或者在下一次点击的时候判断上一次是否加载完成,如果没完成则提示,等待完成。
哪位熟悉这个的有什么好办法?

3个回答

wszde2
wszde2   2016.01.20 08:59
已采纳

如果原线程仍在执行的话是无法立即结束掉的,因为C#是托管代码,需要通知真正的线程执行单元结束自己要花掉很长时间所以你的方法一不太好用。
方法二只需要声明一个全局的线程对象在点击时间发生后判断下当前线程状态就行了。
当前工作线程如果要调用UI线程显示数据的话用这样的语法:
工作线程:
{
Action act = ()=>{textBox1.Text = "1"};
textBox1.Invoke(act);
}

caozhy
caozhy   Ds   Rxr 2016.01.20 00:49

控件加载再耗时也没办法,只能把不属于界面操作的放在线程中执行来提高效率。

yangbo50304
yangbo50304   2016.01.20 13:46

有两点:
1.刷新UI的如果数据较多,造成UI比较卡的话,可以考虑把数据分开多份,然后begininvoke去刷UI
2.如果线程没有运行完,但是这时候来了另一个命令的话,其实是应该把这个线程结束掉,但是正常做法不是terminate线程,而是让线程正常运行完毕,但是确不往UI上刷。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!