C#为什么多线程控制winform需要用委托?
2011-04-10 02:24
316 查看
C#为什么多线程控制winform需要用委托?比如我新起了一个线程A,在A线程里要对winform的list控件里显示数据,我需要用一个委托函数来实现。
因为winform是主线程创建的,你用另外一个线程来调用它就可能会出现两个线程同时访问同一个资源的问题,这个时候很容易出现错误,比如A线程改变窗口的颜色为红色,B线程取窗口的颜色,如果这两个线程正好碰到一起,可能A略先于B,那么就是B取出来的红色,如果略后于那么就是原来的颜色,而这和CPU的繁忙度、时间片的轮转是相关的,是一种随机的情况,那么B取出来的颜色就不可靠了,因此为了避免这种状况采用委托,B线程向A线程发出委托,由A线程来完成取色工作,那么可以保证取色工作的稳定性,结果也可靠
如果你实在想通过另一个线程访问winform,可以在窗口的构造函数中加入
Control.CheckForIllegalCrossThreadCalls = false;
这样可以屏蔽这个错误,不过建议还是用委托
这需要用到委托.
你先声明一个委托,然后,把一个操作界面的函数托给他.
你的线程里只要调用这个委托就可以了.
C#试写一个多线程问题(委托,Invoke(),beginInvoke())
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.ComponentModel;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Data;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Drawing;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Windows.Forms;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Threading;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Diagnostics;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
namespace _
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
public partial class Form1 : Form
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
public delegate void del(string str);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
public delegate void del1(string str1);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
Thread thread1,thread2;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
public Form1()
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
InitializeComponent();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void button1_Click(object sender, EventArgs e)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.thread1 = new Thread(new ThreadStart(this.sa));
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.thread1.Start();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//MessageBox.Show(this,);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.button1.Enabled = false;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//获取当前的线程好
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
int thread1id = Thread.CurrentThread.GetHashCode();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
string strThreadId = Convert.ToString(thread1id);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
MessageBox.Show(this,strThreadId);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void progressSet(string text)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
progressBar1.Value = 0;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
progressBar1.Maximum = 999999;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
for (int i = 0; i < 999999; i++)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
progressBar1.Value++;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
progressBar1.Value = 0;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void sa()
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
del pro = new del(progressSet);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.Invoke(pro, new object[] { "hello" });
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void button2_Click(object sender, EventArgs e)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.thread2 = new Thread(this.sa1);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
thread2.Start();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.button2.Enabled = false;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//获取当前的线程好
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
int thread2id = Thread.CurrentThread.GetHashCode();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
string strThreadId = Convert.ToString(thread2id);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
MessageBox.Show(this, strThreadId);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void sa1()
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//其他操作
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//比如将界面的TextBox内容设置一下
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
del1 mi1 = new del1(UpdateTextBox);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.Invoke(mi1, new object[] { "我是一个文本框" });
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//更新界面的方法
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void UpdateTextBox(string str)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//更新
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.textBox1.Text = str;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
因为winform是主线程创建的,你用另外一个线程来调用它就可能会出现两个线程同时访问同一个资源的问题,这个时候很容易出现错误,比如A线程改变窗口的颜色为红色,B线程取窗口的颜色,如果这两个线程正好碰到一起,可能A略先于B,那么就是B取出来的红色,如果略后于那么就是原来的颜色,而这和CPU的繁忙度、时间片的轮转是相关的,是一种随机的情况,那么B取出来的颜色就不可靠了,因此为了避免这种状况采用委托,B线程向A线程发出委托,由A线程来完成取色工作,那么可以保证取色工作的稳定性,结果也可靠
如果你实在想通过另一个线程访问winform,可以在窗口的构造函数中加入
Control.CheckForIllegalCrossThreadCalls = false;
这样可以屏蔽这个错误,不过建议还是用委托
这需要用到委托.
你先声明一个委托,然后,把一个操作界面的函数托给他.
你的线程里只要调用这个委托就可以了.
C#试写一个多线程问题(委托,Invoke(),beginInvoke())
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.ComponentModel;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Data;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Drawing;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Windows.Forms;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Threading;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
using System.Diagnostics;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
namespace _
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
public partial class Form1 : Form
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
public delegate void del(string str);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
public delegate void del1(string str1);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
Thread thread1,thread2;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
public Form1()
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
InitializeComponent();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void button1_Click(object sender, EventArgs e)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.thread1 = new Thread(new ThreadStart(this.sa));
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.thread1.Start();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//MessageBox.Show(this,);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.button1.Enabled = false;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//获取当前的线程好
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
int thread1id = Thread.CurrentThread.GetHashCode();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
string strThreadId = Convert.ToString(thread1id);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
MessageBox.Show(this,strThreadId);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void progressSet(string text)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
progressBar1.Value = 0;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
progressBar1.Maximum = 999999;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
for (int i = 0; i < 999999; i++)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
progressBar1.Value++;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
progressBar1.Value = 0;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void sa()
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
del pro = new del(progressSet);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.Invoke(pro, new object[] { "hello" });
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void button2_Click(object sender, EventArgs e)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.thread2 = new Thread(this.sa1);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
thread2.Start();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.button2.Enabled = false;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//获取当前的线程好
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
int thread2id = Thread.CurrentThread.GetHashCode();
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
string strThreadId = Convert.ToString(thread2id);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
MessageBox.Show(this, strThreadId);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void sa1()
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//其他操作
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//比如将界面的TextBox内容设置一下
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
del1 mi1 = new del1(UpdateTextBox);
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.Invoke(mi1, new object[] { "我是一个文本框" });
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//更新界面的方法
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
private void UpdateTextBox(string str)
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
{
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
//更新
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
this.textBox1.Text = str;
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
![](http://lovefly.blog.51cto.com/images/editer/InBlock.gif)
}
相关文章推荐
- 转载:C#为什么多线程控制winform需要用委托?
- C#为什么多线程控制winform需要用委托?
- C#为什么多线程控制winform需要用委托?
- C#为什么多线程控制winform需要用委托?
- C# 通过委托控制进度条以及多线程更新控件
- C# 通过委托控制进度条以及多线程更新控件
- C# 通过委托控制进度条以及多线程更新控件
- C# 多线程控制控件实例(invoke,控件的委托方法)
- !!c# 委托与多线程 -- 相比background来说,本方法针对当需要通过异步代理发起UI操作,而后线程中进行sleep操作的时使用
- c#为什么需要事件委托
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- [转] c#有关winform的两个代码片段(多线程操作窗体控件与窗体淡入淡出效果)
- c# 控制winform程序只能打开一个
- 多线程、委托、Invoke解决winform界面卡死的问题,并带开关
- 基于C# winform企业进销存软件开发(典型权限控制+报表工具+动态加载+多线程+跨数据库访问)
- 从项目外包的角度出发,分析为什么要有委托,异步,多线程,事件,委托多播这些概念,之间怎么联系
- C#的委托事件在winform窗体中实现传值备忘
- C# Delegate/委托 与多线程
- C#中为什么需要装箱拆箱操作?
- c#中Winform实现多线程异步更新UI(进度及状态信息)