blogjava's web log

          blogjava's web log
          ...

          [小技巧]winfrom使用多線程

          ? 就拿我寫的備份新浪博客的小程序說。。當我點備份按鈕的時候,如果不用線程。。那窗體可能就會假死在那,一動不動的。給用戶感覺很不爽的。。那要怎么解決呢??

          你可能會覺的這個很簡單。幾行代碼就搞定。

          定義個方法
          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)
          ????????{
          ??????????
          //
          ????????}


          ????}
          }

          點擊源代碼下載

          posted on 2006-10-09 20:50 record java and net 閱讀(797) 評論(0)  編輯  收藏 所屬分類: dot net相關

          導航

          常用鏈接

          留言簿(44)

          新聞檔案

          2.動態語言

          3.工具箱

          9.文檔教程

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 克东县| 罗甸县| 千阳县| 都匀市| 洞头县| 仲巴县| 故城县| 廊坊市| 徐汇区| 浮梁县| 武穴市| 泰和县| 万宁市| 西充县| 泌阳县| 上饶市| 五原县| 河间市| 和林格尔县| 鄱阳县| 滦南县| 万盛区| 盈江县| 浦城县| 辽宁省| 兴海县| 上饶县| 类乌齐县| 东明县| 阿荣旗| 上犹县| 大竹县| 山西省| 渝北区| 湾仔区| 新疆| 桦甸市| 仁化县| 炎陵县| 高台县| 贡觉县|