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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Winform开发中耗时操作封装用异步执行(.net 4.0)
先定义一个 BackgroundTask.cs 代码如下:public class BackgroundTask { private static WaitDialogForm LoadingDlgForm = null; public static void BackgroundWork(Action<object> action, object obj)
C# 委托 回调 操作UI主线程 学习笔记
本篇相当于是对前面两篇博的一个简单总结,相当于为c#开发桌面程序有了一个多线程的应用方案。涉及了委托传参,回调委托,跨线程等。下面先直接上代码: 这段代码实现了,点Start按钮,开始更新进度条,当进度条走到100的时候,停止,在进度条更新中,任意时刻点击Stop,停止,大致界面是这样的: public partial class Form1 : Form { p
解决卡顿——在WPF中使用多线程更新UI
 解决卡顿——在WPF中使用多线程更新UI 有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例:     public partial class MainWindow : Window     {         public MainWindow()         {             InitializeCo
最简单解决c#在UI线程中执行耗时方法导致界面假死的方法
int sta = my_connect.login(_user_name, _password);如上,login方法中通过http向服务器发请求,在网络状况不好或者服务器繁忙的时候,会因为迟迟等不到返回结果导致页面假死。解决办法:int sta = await Task.Run(() => { return my_connect.logi
在Winform中使用C#异步优化耗时操作
ThreadPool.QueueUserWorkItem((obj) =>             {                 if (InvokeRequired && IsHandleCreated)                 {                     this.BeginInvoke(new Action(delegate(object arg)  
C# 异步线程加载数据 更新UI
关于多线程的处理,最近用的比较多,所以总结一下: 所谓异步加载数据,就是防止UI主线程加载大量数据(执行太多操作而死掉)。其实很简单,需要用到UI元素的在主线程,后台加载的数据都是与界面无关的。 加载的数据可以实时反应到UI界面上。其实就是使用了事件的做法 下面是一个例子: public class ThreadHelper { private DirectoryIn
Java模拟耗时任务异步执行
说明:耗时任务开启单独线程处理,任务线程处理完毕通知主线程 1、回调接口定义 public interface ResponseCallBack { public void printMsg(String msg); } 2、模拟耗时任务线程 public class TestMain { public static void main(String[] args)
Xamarin.Android如何异步更新UI线程
异步更新UI在App开发中是不可避免的一个话题 在原生App开发中有这样两种主流方式: (1) Handler消息传递机制 (2)AsyncTask异步任务 那么在Xamarin.Android 中我们究竟又应以怎样的方式去异步更新UI呢? 答案: (1) https://www.majormojo.co.uk/blog/await-and-the-ui-thread.html
c# 多线程异步更新UI
多线程更新UI  下面是几个关于更新UI的贴子:  http://www.cnblogs.com/whssunboy/archive/2007/06/07/775319.html  http://www.cnblogs.com/Rustle/archive/2004/05/25/11302.html       
iOS 使用GCD多线程技术来处理耗时任务
现在的iOS是默认支持多线程的,有些操作比较耗时,但这些耗时的线程不能阻塞主线程。因此需要在实现时,注意确保主线程的顺畅,及时响应用户的交互。1. 处理耗时的逻辑操作比如进行图像的压缩和裁剪等耗CPU或GPU的操作时,可以将这些操作放在全局队列中异步执行:dispatch_async(dispatch_get_global_queue(0, 0), ^{ //complex logic