修改ui-C# click事件 多线程 异步 耗时 操作UI

问题描述

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

解决方案

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

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

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

时间: 2024-09-14 07:09:53

修改ui-C# click事件 多线程 异步 耗时 操作UI的相关文章

多线程-在html中调用ocx组件,其click事件在运行过程中如何改变按钮状态?

问题描述 在html中调用ocx组件,其click事件在运行过程中如何改变按钮状态? 20C 我在做一个简单的网页demo,使用html语言调用ocx组件的方式完成前端功能加载和运行,我使用了一个按钮来调用ocx组件.我现在的问题是:我需要通过UI界面来清楚表示ocx组件的运行进度,比如:点击"执行"按钮,在执行过程中,按钮框变成"正在执行..."或者增加某种进度提示信息,当ocx组件执行完成后,按钮状态能够还原.我使用了很多方式,比如:1.增加进度条:2.通过定时

C#WinForm 的Click事件点一下就整个画面都死了,请大神教教怎么办

问题描述 Click事件是一个大循环执行远程的SSRS文件导出.执行的事件比较长,在此过程中画面没有反应,必须要等到所有代码执行完成才行.请问大神,有没有办法呀. 解决方案 解决方案二:自己顶一下.解决方案三:点击后将耗时是程序放到线程中去解决方案四:使用BackgroundWorker组件,上面是很久之前的一个demo额解决方案五:异步执行工作解决方案六:放进线程以后哦,报服务器错误.System.Threading.Threadthread=newSystem.Threading.Threa

Android多线程----异步消息处理机制之Handler详解

[正文] 虽然是国庆佳节,但也不能停止学习的脚步,我选择在教研室为祖国母亲默默地庆生. 关于Android的多线程知识,请参考本人之前的一篇博客:Android 多线程----AsyncTask异步任务详解 在Android当中,提供了异步消息处理机制的两种方式来解决线程之间的通信问题,一种是今天要讲的Handler的机制,还有一种就是之前讲过的 AsyncTask 机制. 一.handler的引入: 我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会

.NET中基于事件的异步模式-EAP_实用技巧

前言 在C# 5.0中,新增了async await 2个关键字支持异步编程的操作.在讲述这两个关键字之前,我先总结一下.NET中的常见的异步编程模型. 异步编程一直是比较复杂的问题,其中要处理多线程之间的数据同步.获取进度.可取消.获取结果.不影响主线程操作.多个任务之间互相不影响等,因此需要设计编程模型去处理此类问题. 从.NET 4.5开始,支持的三种异步编程模式: 基于事件的异步编程设计模式 (EAP,Event-based Asynchronous Pattern) 异步编程模型(AP

javascript 多线程异步队列

首先,你得知道 jQuery.Deferred 的大致用法,然后,我们进入正题吧: 库代码: /*!  * 多线程异步队列  * 依赖 jQuery 1.8+ (如果你用的是 1.6或1.7, 只要将源码中的 then方法替换为pipe方法 即可)  */ /**  * @n {Number} 正整数, 线程数量  */ function Queue (n) {     n = parseInt(n 1, 10);     return new Queue.prototype.init( (n

.NET Compact Framework多线程环境下的UI异步刷新

在进行WinCe或者Windows Mobile开发中,通常需要把一些任务提交给工作线程(Worker Thread)完成,当worker thread 线程发生状态变更的时候需要通知UI进程刷新UI,比如一个网络连接程序,Worker Thread线程负责管理WiFi,GPRS或者3G等连接,当连接状态发生改变时候,Worker Thread把更新状态通知UI Thread,而UI Thread更新UI通知用户. 这里常常有个疑问,为什么Worker Thread不直接更新UI,这样更简单直接

click事件的参数可以变化吗?

问题描述 现有这样的jquery click事件:$(document).ready(function() { $curtainopen = false; $(".rightcurtain").click(function(){ $(this).blur(); if ($curtainopen == false){ $(this).stop().animate({top: '0px' }, {queue:false, duration:350, easing:'easeOutBounc

关于javaScript注册click事件传递参数的不成功问题_javascript技巧

最近这半年作为一个java 程序员,我写的javaScript代码都快比java代码多了,前段时间是给某银行做一个柜员管控系统,在柜员授权这一块功能上,由于柜员的授权需要考虑各方面的因素,比如机构权限.柜员类型权限.岗位权限,业务权限等等,并且要对这些权限要做多次的交集或者并集处理,页面上不得不用许多的javascript来进行控制.造成了这一功能模块的实现上javaScript代码比java代码负责的情况. 而现在又要给某银行开发一个保管箱管理系统,其核心功能块保管箱座管理以及保管箱管理,为实

extjs 中 给组件添加click 事件是怎么关联到dom事件的?

问题描述 var element = Ext.get('domid');var component = Ext.getCmp('domid') 各添加一个click事件element.on('click',function(){});component.on('click',function(){});  extjs源码中显示这两种添加事件方式是不同的.给element上添加事件会最终把事件绑定到dom元素上(最终是调用addEventListener or attachEvent)但是comp