? 就拿我寫的備份新浪博客的小程序說。。當我點備份按鈕的時候,如果不用線程。。那窗體可能就會假死在那,一動不動的。給用戶感覺很不爽的。。那要怎么解決呢??
你可能會覺的這個很簡單。幾行代碼就搞定。
定義個方法
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)
????????{
??????????//
????????}
????}
}
點擊源代碼下載