ZDL男人海洋
2016-01-19 16:21
采纳率: 100%
浏览 2.1k
已采纳

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

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

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • wszde2 2016-01-20 00:59
    已采纳

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

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • threenewbee 2016-01-19 16:49

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

    评论
    解决 无用
    打赏 举报
  • yangbo50304 2016-01-20 05:46

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题