就拿我写的备份新浪博客的小程序说。。当我点备份按钮的时候,如果不用线程。。那窗体可能就会假死在那,一动不动的。给用户感觉很不爽的。。那要怎么解决呢??
你可能会觉的这个很简单。几行代码就搞定。
定义个方法
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)
{
//
}
}
}