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.文檔教程

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 平阴县| 开鲁县| 垣曲县| 长顺县| 石嘴山市| 甘南县| 平凉市| 达州市| 平阳县| 临夏县| 如皋市| 新沂市| 玛纳斯县| 朝阳县| 遵化市| 永嘉县| 固安县| 江源县| 阿克苏市| 和政县| 滨州市| 寿宁县| 广宗县| 泾阳县| 邵武市| 安远县| 深水埗区| 增城市| 宜川县| 姜堰市| 宁陕县| 德兴市| 城口县| 达日县| 涿鹿县| 珲春市| 施甸县| 西城区| 锡林郭勒盟| 玉山县| 仪征市|