[小技巧]winfrom使用多线程
来源:互联网 发布:电子系单片机毕业设计 编辑:程序博客网 时间:2024/05/17 03:12
就拿我写的备份新浪博客的小程序说。。当我点备份按钮的时候,如果不用线程。。那窗体可能就会假死在那,一动不动的。给用户感觉很不爽的。。那要怎么解决呢??
你可能会觉的这个很简单。几行代码就搞定。
定义个方法
public void MyTest()
{
for (int i = 0; i < 100; i++)
{
this.textBox1.Text = i.ToString();
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread myThread = new Thread(MyTest);
myThread.Start();
}
很遗憾。
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: 线程间操作无效: 从不是创建控件“textBox1”的线程访问它。
问题解决:
1.定义 委托
delegate void myDelegate(int i);
myDelegate mydelegate = null;
2.定义方法,显示消息
public void ShowMessage(int i)
{
this.textBox1.Text = i.ToString();
this.progressBar1.Value = i;
}
3.定义方法,驱动消息
public void MyEvent()
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
this.BeginInvoke(mydelegate, new object[] {i});
}
}
4: 运行
private void button1_Click(object sender, EventArgs e)
{
mydelegate = new myDelegate(ShowMessage);
Thread myThread = new Thread(MyEvent);
//IsBackground 是否后台
//这个属性很重要 .如果 Thread IsBackground 等于false
// 当线程还没有结束时,你点了关闭按钮
// 将抛出An unhandled exception
//of type 'System.InvalidOperationException'
//occurred in System.Windows.Forms.dll 异常
myThread.IsBackground = true;
myThread.Start();
}
全都代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WinfromTheadTest
{
public partial class Form1 : Form
{
delegate void myDelegate(int i);
myDelegate mydelegate = null;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
mydelegate = new myDelegate(ShowMessage);
Thread myThread = new Thread(MyEvent);
//IsBackground 是否后台
//这个属性很重要 .如果 Thread IsBackground 等于false
// 当线程还没有结束时,你点了关闭按钮
// 将抛出An unhandled exception
//of type 'System.InvalidOperationException'
//occurred in System.Windows.Forms.dll 异常
myThread.IsBackground = true;
myThread.Start();
}
public void ShowMessage(int i)
{
this.textBox1.Text = i.ToString();
this.progressBar1.Value = i;
}
public void MyEvent()
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
this.BeginInvoke(mydelegate, new object[] {i});
}
}
private void button2_Click(object sender, EventArgs e)
{
//
}
}
}
点击源代码下载
你可能会觉的这个很简单。几行代码就搞定。
定义个方法
public void MyTest()
{
for (int i = 0; i < 100; i++)
{
this.textBox1.Text = i.ToString();
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread myThread = new Thread(MyTest);
myThread.Start();
}
很遗憾。
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: 线程间操作无效: 从不是创建控件“textBox1”的线程访问它。
问题解决:
1.定义 委托
delegate void myDelegate(int i);
myDelegate mydelegate = null;
2.定义方法,显示消息
public void ShowMessage(int i)
{
this.textBox1.Text = i.ToString();
this.progressBar1.Value = i;
}
3.定义方法,驱动消息
public void MyEvent()
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
this.BeginInvoke(mydelegate, new object[] {i});
}
}
4: 运行
private void button1_Click(object sender, EventArgs e)
{
mydelegate = new myDelegate(ShowMessage);
Thread myThread = new Thread(MyEvent);
//IsBackground 是否后台
//这个属性很重要 .如果 Thread IsBackground 等于false
// 当线程还没有结束时,你点了关闭按钮
// 将抛出An unhandled exception
//of type 'System.InvalidOperationException'
//occurred in System.Windows.Forms.dll 异常
myThread.IsBackground = true;
myThread.Start();
}
全都代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WinfromTheadTest
{
public partial class Form1 : Form
{
delegate void myDelegate(int i);
myDelegate mydelegate = null;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
mydelegate = new myDelegate(ShowMessage);
Thread myThread = new Thread(MyEvent);
//IsBackground 是否后台
//这个属性很重要 .如果 Thread IsBackground 等于false
// 当线程还没有结束时,你点了关闭按钮
// 将抛出An unhandled exception
//of type 'System.InvalidOperationException'
//occurred in System.Windows.Forms.dll 异常
myThread.IsBackground = true;
myThread.Start();
}
public void ShowMessage(int i)
{
this.textBox1.Text = i.ToString();
this.progressBar1.Value = i;
}
public void MyEvent()
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
this.BeginInvoke(mydelegate, new object[] {i});
}
}
private void button2_Click(object sender, EventArgs e)
{
//
}
}
}
点击源代码下载
- [小技巧]winfrom使用多线程
- WinFrom开发小技巧
- winfrom 小技巧
- winfrom使用多线程
- winfrom使用多线程
- winfrom中导入word几个小技巧
- winfrom开发小技巧三则
- Winfrom DateTimePicker控件 Custom时间格式修改小技巧
- spring+多线程小技巧
- winfrom 多线程更新UI
- WinFrom模拟多线程数据处理
- winfrom个人小闹钟
- winfrom小知识点
- c++ 多线程调试小技巧
- 多线程死锁调试小技巧
- 多线程死锁调试小技巧
- 多线程死锁调试小技巧
- 多线程死锁调试小技巧
- 按比例生成缩略图
- 一个值得研究的系统存储过程 sp_MSforeachtable
- 杀手4血钱之黄昏十二乐章[剧情完全翻译]by maddogchen
- ASP.NET 程序中常用的三十三种代码
- 郁闷,streamreader空间开销好大啊,
- [小技巧]winfrom使用多线程
- 细胞分裂3[详细剧情过关动画与任务布置详尽翻译]by kuangtian
- 西北农林科技大学,我的母校! http://xnxy.43i.net/index.php
- 关于去耦电容作用和应用的精辟解说
- 读博or工作
- 如何屏蔽触发器和恢复触发器
- 版本管理器VisualSourceSafe6.0实用指南
- Beyond Single Language —— 有感Beginning C# Object中文版
- Jsp中导出查询结果到excel文件的简单方法