C#中利用委托实现多线程跨线程操作
2007-06-20 14:28
501 查看
在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便。
其实解决这个问题有两种方法:
一,是通过设置
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的这个错误了。
二,就是委托了,个人建议用这种方法
首先在WinForm窗体中拖入ListBox控件,然后参照以下代码:
Thread t1;//声明一个全局线程
private void Form1_Load(object sender, EventArgs e)
{
t1 = new Thread(new ThreadStart(BackgroundProcess));
t1.Start(); //开始
}
delegate void aa();
private void BackgroundProcess()
{
// 将委托实例化
aa a= delegate()
{
for (int i = 0; i < 50; i++)
{
listBox1.Items.Add("Iterations: " + i.ToString());
Thread.Sleep(300);
listBox1.Refresh();
}
}; listBox1.Invoke(a);
}
以上代码大家如果不懂请跟贴 我会详细解答!
其实解决这个问题有两种方法:
一,是通过设置
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的这个错误了。
二,就是委托了,个人建议用这种方法
首先在WinForm窗体中拖入ListBox控件,然后参照以下代码:
Thread t1;//声明一个全局线程
private void Form1_Load(object sender, EventArgs e)
{
t1 = new Thread(new ThreadStart(BackgroundProcess));
t1.Start(); //开始
}
delegate void aa();
private void BackgroundProcess()
{
// 将委托实例化
aa a= delegate()
{
for (int i = 0; i < 50; i++)
{
listBox1.Items.Add("Iterations: " + i.ToString());
Thread.Sleep(300);
listBox1.Refresh();
}
}; listBox1.Invoke(a);
}
以上代码大家如果不懂请跟贴 我会详细解答!
相关文章推荐
- C#中利用委托实现多线程跨线程操作
- C#中利用委托实现多线程跨线程操作
- C#中利用委托实现多线程跨线程操作
- C#中利用委托实现多线程跨线程操作
- C#构建多线程应用程序(1) —— 使用委托来自动创建次线程以实现异步方法的调用
- c# 用委托实现多线程之间的操作
- !!c# 委托与多线程 -- 相比background来说,本方法针对当需要通过异步代理发起UI操作,而后线程中进行sleep操作的时使用
- C#基于委托实现多线程之间操作的方法
- C# :线程中操作多控件 (委托实现异步及同步的方法)
- 【C#】利用委托解决跨线程操作控件产生的问题
- C#利用委托跨线程更新UI数据
- C#利用委托跨线程更新UI数据
- c#利用委托跨线程调用UI控件完整使用方法
- VC中利用多线程实现线程间通信
- C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法
- C# 多线程与异步操作实现的探讨
- C# :实现水印与图片合成,并利用Graphics 压缩图像质量 , (委托实现listBox的动态添加提示)。。。。。。。。。。。。
- 利用C#2005实现数据表的基本操作
- C# 利用委托实现窗体间传值
- 利用C#线程机制实现应用程序的单实例运行