C#解决多线程窗口UI假死--委托的使用:
1.使用了Thread.Sleep()模拟线程耗时运行;
2.用ParameterizedThreadStart创建了一个带参数的线程,使UI界面上输入的值能传递到线程中;
3.线程运行期间,能够拖动UI窗口;
4.线程结束后,结果显示到UI上。
5.本例子旨在理解如何解决UI卡死问题,使用该方法会是否会出现什么问题,暂不予探究。
主代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading; //需添加此引用
namespace WindowsFormsApplication1
public partial class Form1 : Form
public Form1()
InitializeComponent();
public delegate void CalcHandle(int num); //声明一个委托
private void button1_Click(object sender, EventArgs e)
int content = 0;
int.TryParse(textBox1.Text.ToString(), out content); //表示将数字内容的字符串转为int类型,int.TryParse与 int.Parse类似,但它不会产生异常,转换成功返回 true,转换失败返回 false
button1.Enabled = false; //禁用按键,以免点击多次点击创建多个线程
Thread th = new Thread(new ParameterizedThreadStart(TaskDo)); //用ParameterizedThreadStart创建一个带参数的线程
th.Start(content); //传递参数content给TaskDo
//线程方法
public void TaskDo(object num)
int r = 0;
int.TryParse(num.ToString(), out r);
Thread.Sleep(5000); //模拟耗时的线程
int result = r * r; //模拟取得计算结果:r的平方
CalcHandle dele = new CalcHandle(UpdateUi);
this.Invoke(dele, result);
catch (Exception ex)
throw(ex);
public void UpdateUi(int num)
label1.Text = num.ToString();
if (button1.Enabled == false)
button1.Enabled = true;
运行结果:
C# 多线程界面假死解决,正确使用多线程
没分的朋友可以到我blog搜索“多线程界面假死”
blog地址:http://blog.csdn.net/Andrew_wx
欢迎提出建议。
一、六种多线程方法
.NET Framework2.0框架提供了至少4种方式实现多线程,它们是“BackgroundWorker”组件、委托的异步调用、线程池ThreadPool以及线程类Thread;.NET Framework 4.0增加了任务并行库TPL和PLINQ技术,
进程:是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。线程:是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。线程和进程区别:进程是资源分配的最...
http://smartsoft2005.cnblogs.com/archive/2005/09/11/234687.html 前言
在我们应用程序开发过程中,经常会遇到一些问题,需要使用多线程技术来加以解决。本文就是通过几个示例程序给大家讲解一下多线程相关的一些主要问题。
执行长任务操作
许多种类的应用程序都需要长时间操作,比如:执行一个打印任务,请求一个 Web Service 调用等...
都说Invoke是同步的,BeginInvoke是异步的,但为何用BeginInvoke做耗时操作依然会卡死UI?
http://www.cnblogs.com/blosaa/archive/2013/05/30/3107381.html
BeginInvo...
在之前的《创建无阻塞的异步调用》中,已经介绍过异步调用的编写步骤和实施原理。异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能、可伸缩应用程序的关键。在多核CPU越来越普及的今天,异步编程允许使用非常少的线程执行很多操作。我们通常使用异步完成许多计算型、IO型的复杂、耗时操作,去取得我们的应用程序运行所需要的一部分数据。在取得这些数据后,我们需要将它们绑定在U...
在研究c# 线程之间通信时,发现传统的方法大概有三种
①全局变量,由于同一进程下的多个进程之间共享数据空间,所以使用全局变量是最简单的方法,但要记住使用volatile进行限制。
②线程之间发送消息(这个随后文章中会讨论到)。
③ CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步,这个主要是实现线程直接同步的一种方法。
当我们的界面需要在程序运行中不断更新数据时,当一个textbox的数据需要变化时,为了让程序执行中不出现界面卡死的现像,最好的方法就是多线程来解决
一个主线程来创建界面,使用一个子线程来执行程序并更新主界面
这个问题其实也困或了我很久,但是今天终于解决了,而且我发现很多人有这样的问题,所以我分享一个例子方便大家参考吧。
先来看看我的界面
当我点击开启线程后
下面是我的