c# 通过异步委托的执行结果更新ui界面设计欣赏

WinForm C# 多线程编程并更新界面(UI) - 下载频道
- CSDN.NET
&&&&WinForm C# 多线程编程并更新界面(UI)
WinForm C# 多线程编程并更新界面(UI)
嵌到我的页面
<input type="text" readonly="true" value="">
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行问题补充&&
猜你感兴趣
服务声明: 信息来源于互联网,不保证内容的可靠性、真实性及准确性,仅供参考,版权归原作者所有!Copyright &
Powered byc# 多线程 ui winform界面-中国学网-中国IT综合门户网站
> c# 多线程 ui winform界面
c# 多线程 ui winform界面
转载 编辑:李强
为了帮助网友解决“c# 多线程 ui winform界面”相关的问题,中国学网通过互联网对“c# 多线程 ui winform界面”相关的解决方案进行了整理,用户详细问题包括:finish&;&#47; t:我在 一个button的click事件中调用了一个线程private void button1_Click(finish&quot.text=&quot。我该怎么办呢我现在有个问题;以及以后的语句;还有一些代码}现在我想让这个线程中的方法完成之后再执行text1.start(), EventArgs e){ thread t=new thread(SetValue); ……………………&#47;; text1.text=&quot,具体解决方案如下:解决方案1:Start();}private void SetValue(){ / t, EventArgs e){ button1,不能干其他的事情(包括移动窗体)直到线程中的方法执行完毕为止;还有一些代码),你还可以干其他的事情.线程的主要计算..DoEvents(),最后按钮恢复原状(让按钮变灰是为了不让用户重复地点击.Join();...;还有一些代码 button1..Join(); text1..text=&quot。 Application.Enabled =&#47.text=&/finish&quot。如果你这么写;finish&quot.;&#47,按钮变灰;.Enabled =;还有一些代码); t.Start(); ……………………//}则效果是当你点击这个按钮时; t,主线程一直被阻塞,也就是说你感觉程序卡住了一样:private void button1_Click(&#47,当方法执行完毕后执行你的代码(……………………/还有一些代码}这段代码的效果是在执行完线程中的方法之前; text1.; ……………………&#47,当方法执行完毕后执行你的代码(……………………&#47..,以招致方法未完成之前又重复调用按钮触发事件private void button1_Click( Thread t=new Thread(new ThreadStart(SetValue)), EventArgs e){ Thread t=new Thread(new ThreadStart(SetValue))解决方案2:谢谢,还有 gwl3323405 回答的简单到位,谢谢你们解决方案3:}private void SetValue(){do your work here &#47:private void button1_Click(object sender,将text1:// ……………………/; thread t=new thread(SetValue);&#47.finish&quot,请参考. ……………………&#47。 text1。如下;&#47,设置Control.text=&quot.90);&#47.CheckForIllegalCrossThreadCalls = false:.CheckForIllegalCrossThreadCalls的值为false(这也被认为是不安全的).com/en-us/library/ms171728(VS.text=&线程的主要计算.com/en-us/library/ms171728" target="_blank">finish&还有一些代码放在线程执行的方法后面;还有一些代码}如何实现线程安全, EventArgs e){ Control最简单的方法解决方案4:}private void SetTextValue() { text1。private void button1_Click(object sender,但是想要访问还是可以的;}private void SetValue(){ /线程最后代码 text1;.Invoke(new Action(SetTextValue));&#47, EventArgs e){ C thread t=new thread(SetValue)ui控键除了主线程,其他是不可以访问的.text = &finish&quot.CheckForIllegalCrossThreadCalls = t.start()解决方案5:如果是要用多线程里面来设置的话,是不行的因为.NET的UI只能是在创建线程内修改,这是.NET机制决定的如果一定要在多线程内修改的话,需要用text1.Invoke方法详细请参见MSDN解决方案6:那把text1.text=&finish&;放在要签名中的方法中不就行了吗?放在方法中最后一句。线程本身有停止的方法,但线程一般是循环执行的。通过对数据库的索引,我们还为您准备了:问:我现在有个问题: 我在 一个button的click事件中调用了一个线程 private...答:private void button1_Click(object sender, EventArgs e) { Thread t=new Thread(new ThreadStart(SetValue)); t.Start(); t.Join(); text1.text="finish"; ……………………//还有一些代码 } 这段代码的效果是在执行完线程中的方法之前,主线程一直被...===========================================问:using S using System.Collections.G pon...答:没有看明白你用多线程要实现什么效果?你声明DoWork()方法是在主线程执行的,不是在你声明的副线程中执行,那界面怎么会动呢? 你执行了一个副线程,起到的作用就是执行了Test()方法,没有停留就转到了主线程执行DoWork()方法了,实际效果:相当...===========================================问:最好能给个例子,不要太复杂,也不要太简单。最好子线程放在单独的类中...答:首先在窗体上放一个button和一个picturebox (picturebox visible为false)这个多线程的目的是点击按钮后图片正常的运行,另一线程在睡眠10秒后在执行。 private void button1_Click(object sender, EventArgs e) { //开启线程 System.Threading...===========================================问:C# 多线程与UI响应 的问题. 我的程序有两个线程,一个主线程,一个通信线...答:楼主哥哥可以使用委托,使用Delegate 我给楼主一点提示: 首先,在你要工作的类work中定义一个委托: public delegate void refresh(string xxx); 然后,定义你的工作函数,比如你的通信函数 public void connect(string xxx){ .....;.....;labe...===========================================问:RT我的程序后台处理耗时任务时,程序界面太卡。怎么处理呢?最近才接触...答:首先你要明白,你程序启动的时候会建立一个主线程,这个线程叫UI线程,从字面理解就可以知道这个线程专门处理有关UI(也就是界面)所有的事件。界面卡是因为,你进入了比如点击事件里面,线程一直在处理这个任务,这个任务一直没返回,也就是这...===========================================问:我的主窗体是一个MDI窗体,在里面有他、有一个treeview,利用他来打开新...答:一般在一些网络软件方面需要多线程,单单是管理软件什么的不需要。 在网络软件的话,需要有一个一直读取数据的方法,需要读取远程发来的信息。 方法就是一个死循环。这里如果不用多线程的话,程序一打开就什么也干不了。开了多线程,那个线程就...===========================================问:如题,现在通过子线程来完成某一个任务,该任务需要在其中读取winform界...答:比较简单的写法,在你需要读取的时候,直接 string str="";this.Invoke((EventHandler)(delegate{ // 这里写你的控件代码,比如 //str= target.SelectedT })); 至于普通的写法怎么写,你搜索一下C#跨线程访问就算。 ===========================================问:最近在做基于C#的AutoCAD的二次开发,用dll封装了一个CAD命令程序类,需...答:你那段代码能跑通么? 我不确定。。。。 你可以在下面写 Form1 f=new form1(dis) f。show(); 定义的时候你定义 Form1(string s)===========================================问:根据MSDN上的示例,我想改进一下做成winform上label1和label2变化的例子...答:程序退出的方法:this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出;Application.Exit(); 强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净...===========================================} 这段代码的效果是在执行完线程中的方法之前,主线程一直被阻塞,也就是说你感觉程序卡住了一样,不能干其他的事情(包括移动窗体)直到线程中的方法执行完毕为止,当方法执...=========================================== } 这段代码的效果是在执行完线程中的方法之前,主线程一直被阻塞,也就是说你感觉程序卡住了一样,不能干其他的事情(包括移动窗体)直到线程中的方法执行完毕为止,当方法...=========================================== 多线程; 新开一个线程去添加,避免后台线程和UI线程竞争时间片,导致界面假死。===========================================动态变更控件树等。在WinForm程序开发时,一旦涉及多线程操作,我们一般不可能没有... 基于DirectX 9&#47;10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量...===========================================
本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助using System.T
using System.Windows.F
namespace ThreadTest
public partial class Form1 : Form
public Form1()
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls =//这一行是关键
private void btnSet_Click(object sender, EventArgs e)
Thread t = new Thread(new ParameterizedThreadStart(SetTextBoxValue));
t.Start(&Hello World&);
void SetTextBoxValue(object obj)
this.textBox1.Text = obj.ToString();
这种方法是最方便,实现最简单的方式,但是这样等于是线程之间是去了限制,子线程能够直接控制父线程的控件,会出现线程之间的冲突,不是好的实现方式2.利用BackgroundWorkerC# code
using System.Windows.F
namespace ThreadTest
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void btnSet_Click(object sender, EventArgs e)
//MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
using (BackgroundWorker bw = new BackgroundWorker())
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync(&Hello World&);
void bw_DoWork(object sender, DoWorkEventArgs e)
//MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
e.Result = e.A//这里只是简单的把参数当做结果返回,当然您也可以在这里做复杂的处理后,再返回自己想要的结果(这里的操作是在另一个线程上完成的)
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
//这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了
this.textBox1.Text = e.Result.ToString();
//MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
这种方式只能在异步结束后给控件赋值,--即bw_DoWork是异步处理,异步处理过程中不能给控件赋值--bw_RunWorkerCompleted方法中可以给控件赋值,可是这个过程不是异步的,如果在bw_RunWorkerCompleted中加上一个System.Threading.Thread.Sleep(3000);画面还是会假死3.不使用BackgroundWorker,自己来写线程来实现类似于BackgroundWorker的处理子线程给主线程成员赋值的迷惑C# code
// 代码中自己定义的按钮(非显示按钮)
private Button testBtn = new Button();
private void button1_Click(object sender, EventArgs e)
Thread thr = new Thread(ControlParent);
thr.Start();
private void ControlParent()
Thread.Sleep(3000);
// 给自己定义的按钮赋值没有问题
testBtn.Text = &eeee&;
// 给画面上显示的按钮赋值,InvalidOperationException错误(这里迷糊了,子线程不能直接给主线程赋值,那么主线程是什么?)
this.button1.Text = &asda&;// InvalidOperationException!!!!!!!!!!!
这里的两个按钮,同样是属于一个类,只不过一个显示在画面上,另一个只定义了没有显示,为什么一个赋值成功,另一个就是败了,求大哥大姐们来个破解之法,感激不尽。PS:窗体的this.BeginInvoke只能不阻塞后面代码的执行,不能解决画面假死以上描述够清楚了吧,希望坛子里的大牛们能够诲人不倦,相信不只是我迷糊,还会有不少人也在迷糊着,希望能够来人指教了,欢迎指教讨论,感激不尽------解决方案--------------------
this.progressBar1.Invoke(new System.Action(delegate()
double pro = (double)index / ((double)MaxId - (double)MinId) * 100;
this.lbprogressBar.Text = pro.ToString(&N2&) + &%&;
if (pro &= 100)
pro = 100;
this.progressBar1.Value = Convert.ToInt32(pro);
------解决方案--------------------C# code
this.BeginInvoke((MethodInvoker)delegate
this.button1.Text = &asda&;
------解决方案--------------------主线程就是UI线程啊。你在非UI线程上默认是不能更新UI线程上的东西的。你需要将更新这个委托交给UI线程自己去执行。你可以在ControlParent中这样写来更新BUTTON1this.Invoke(()=&{button1.Text=&asda&;});
------解决方案--------------------数据集.Fill(缓存数据表, 表名);/这里会是时钟控件无法执行/ 建立连接.Close();一般读数据库ACCESS会出现这种情况,慢的电脑会使主界面状态栏中显示时间停顿5-10秒不等,即使使用线程或一部也无法解决。图片一般使用异步也就可以了,慢的电脑也不显得慢。
------解决方案--------------------[code=C#][/code]using Susing System.Windows.Fusing System.Tnamespace WindowsFormsApplication1{
public partial class Form1 : Form
public Form1()
InitializeComponent();
private delegate void DeleWork();//委托
private Button testBtn = new Button();
private void button1_Click(object sender, EventArgs e)
Thread thread = new Thread(threadWork);
thread.IsBackground =
thread.Start();
private void threadWork()
DeleWork ThreadDeleWork = new DeleWork(FormDeleWork);
while (true)
Thread.Sleep(1000);
this.BeginInvoke(ThreadDeleWork);
private void FormDeleWork()
testBtn.Text = &eeee&;
this.button1.Text = &asda&;
textBox1.Text = testBtn.T
------解决方案--------------------一、子线程操作主线程的控件用委托就行;二、把延时的工作放到委托入口之外就不会假死了。希望对你有帮助。
------解决方案--------------------该UI做的就让UI去做,不该UI去做的就不要让UI去做。如果你让UI做的事情太多,比如加载1G的图片这种巨大的操作。那UI本身不做优化的话不卡死就怪了。
------解决方案--------------------LZ是担心这代码段会被不同你的线程访问时冲突吧
void SetTextBoxValue(object obj)&
this.textBox1.Text = obj.ToString();
}这样的话你可以加把锁如:object locker=new object();void SetTextBoxValue(object obj)&
lock(locker)
this.textBox1.Text = obj.ToString();
}这样就可以只有一个线程对SetTextBoxValue进行访问了,其他要访问的线程将会等待,直到SetTextBoxValue完成
------解决方案--------------------简便通用的方法C# code
public static void CrossThreadInvoke(Control ctrl, Action action)
if (ctrl.InvokeRequired)
ctrl.Invoke(action);
action.Invoke();
------解决方案--------------------tryC# code
public class Utils
public static void CrossThreadInvoke(Control ctrl, Action action)
if (ctrl.InvokeRequired)
ctrl.Invoke(action);
action.Invoke();
------解决方案--------------------C# code
Semaphore semaphore = new Semaphore(0, 1);
LoadMainForm(semaphore )
while (!semaphore.WaitOne(TimeSpan.FromMilliseconds(40), false))
Application.DoEvents();
private void LoadMainForm(Semaphore semaphore ){
ThreadPool.QueueUserWorkItem(delegate{
mainForm = new frmMain();
semaphore.Release();
catch (Exception ex){
semaphore.Release();
------解决方案--------------------探讨简便通用的方法C# code
public static void CrossThreadInvoke(Control ctrl, Action action)
if (ctrl.InvokeRequired)
ctrl.Invoke(action);
------解决方案--------------------
声明一个委托 delegate void aa();-------------------------------------------------
Thread.Sleep(3000);
// 给自己定义的按钮赋值没有问题
//testBtn.Text = &eeee&;
// 给画面上显示的按钮赋值,InvalidOperationException错误(这里迷糊了,子线程不能直接给主线程赋值,那么主线程是什么?)
//button1.Text = &asda&;
aa bb = delegate()
button1.Text = &asda&;// InvalidOperationException!!!!!!!!!!!
button1.Invoke(bb); &
这样不造成界面假死
------解决方案--------------------不知道为什么BackgroundWorker在事件中bw_DoWork中已经执行完后,为什么还要在事件bw_RunWorkerCompleted中添加sleep(100000)呢?bw_DoWork把要执行的全部执行完,之后通过参加传递给bw_RunWorkerCompleted,显示到界面上多好 啊?不明白你要做什么。我有使用线程实现类似BackgroundWorker的功能的代码。需要可以联系我。
------解决方案--------------------this.BeginInvoke和Delegate.BeginInvoke完全不是一个概念,你混淆了两者。要界面不卡,多线程后台操作,应该是用后者而不是前者。另外.NET4.5使用async是最佳方案,功能强大且编码快速,唯一的缺点是不支持XP。
------解决方案--------------------探讨你可以试一下这两种实现的效果的就会明白了,和直接Control.Invoke的区别就在于使用Control.Invoke时ui线程需要等待,算不上异步数据处理和ui更新不需要分开,放在一起就可以,一部分数据处理完马上就可以反映在ui上,而不是都处理完了在反映到ui
------解决方案--------------------这个以前遇到过,大数据量加载的假死是在给textbox赋值的时候,这个是瓶颈,不管你用什么方法加载数据,但是一次赋值给textbox的时候一定会假死,使用多少个线程都不行。可以使用分批加载,这样界面不会假死,但是用户仍然要等待,要做的再好一点,可以先加载一部分,等用户拉动滚动条的时候,再加载下一批数据。你可以感觉一下word或者ue的加载,都是分批加载的。再试试记事本是一次加载的(感觉上)。
------解决方案--------------------又纠结于数据的“一致性”,又纠结于硬要多线程去处理它,这往往是自相矛盾的。通常我丝毫没觉得有必要“用异步多线程的语法去模拟顺序阻塞处理”。不过如果你非常想看看异步线程是怎样阻塞自己的,可以参考帖子:http://topic.csdn.net/u//2f7f5cf3-f6e4-4d94-a352-24abdc6c8a2a.html?seed=&r=
------解决方案--------------------我们使用异步编程,是因为有多个足以异步处理的、无关的事情需要并行执行。因此异步编程的大忌就是“用异步多线程编程语法去模拟同步阻塞”,因为它的性能往往是灾难——比简单的顺序执行的性能还差劲。因此我对c#5版本的 await 关键字有些担心,我担心许多c#初学者被它“害了”,以为模拟同步阻塞是一种很随意的多线程设计习惯。尽管 await 本身实现时其实是回调的(而不是阻塞的),但是它没有给初学者展示一个科学而合理的异步多线程编程思路,反而是带到“阴沟”里去了。
------解决方案--------------------多线程的意义在于异步,不是分步!(本文来自互联网,不代表搜站(/)的观点和立场)本站所有内容来自互联网,若本站收录的信息无意侵犯了贵司版权,请给我们来信(),我们会及时处理和回复,谢谢编辑推荐最近更新

我要回帖

更多关于 ui界面设计 的文章

 

随机推荐