<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      淺述WinForm多線程編程與Control.Invoke的應用

      VS2008、C#3.0
      在WinForm開發中,我們通常不希望當窗體上點了某個按鈕執行某個業務的時候,窗體就被卡死了,直到該業務執行完畢后才緩過來。一個最直接的方法便是使用多線程。多線程編程的方式在WinForm開發中必不可少。
      本文介紹在WinForm開發中如何使用多線程,以及在線程中如何通過Control.Invoke方法返回窗體主線程執行相關操作。

      -. WinForm多線程編程
      1. new Thread()

          新開一個線程,執行一個方法,沒有參數傳遞:
          

      private void DoWork() {
                  Thread t = new Thread(new ThreadStart(this.DoSomething));
                  t.Start();
              }
              private void DoSomething() {
                  MessageBox.Show("thread start");
              }


          新開一個線程,執行一個方法,并傳遞參數:
          

      private void DoWork() {
                  Thread t = new Thread(new ParameterizedThreadStart(this.DoSomething));
                  t.Start("guozhijian");
              }
              private void DoSomething(object o) {
                  MessageBox.Show(o.ToString());
              }

          參數定義為object類型。
      2. ThreadPool
          眾所周知,新開一個線程代價是很高昂的,如果我們每個操作都新開一個線程,那么太浪費了,于是,下面使用線程池。
          無參數傳遞:
          

      private void DoWork() {
                  ThreadPool.QueueUserWorkItem(new WaitCallback(this.DoSomething));
              }
              private void DoSomething(object o) {
                  MessageBox.Show("thread start");
              }

          有參數傳遞:
          

      private void DoWork() {
                  ThreadPool.QueueUserWorkItem(new WaitCallback(this.DoSomething), "guozhijian");
              }
              private void DoSomething(object o) {
                  MessageBox.Show(o.ToString());
              }

          使用匿名方法更靈活:
          

      private void DoWork() {
                  string name = "guozhijian";
                  ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object o){
                      MessageBox.Show(name);
                  }));
              }

          在匿名代碼段里面可以直接訪問局部變量,不用在關心參數傳遞的問題
      二. Invoke
      1. this.Invoke
      現在,在業務線程里面執行完畢,要改變窗體控件的值了,此時,如果直接通過this得到控件的句柄,然后對它進行操作是會拋異常的,.Net WinForm Application里面是不允許這樣的操作的。這是,可以調用Invoke方法

      2.Invoke方法簽名:
      object Control.Invoke(Delegate Method)
      object Control.Invoke(Delegate Method, params object[] args)

      3.使用自定義委托

      private void DoWork() {
                  WaitCallback wc = new WaitCallback(this.DoSomething);
                  ThreadPool.QueueUserWorkItem(wc, "Guozhijian");
              }

              private delegate void MyInvokeDelegate(string name);
              private void DoSomething(object o) {
                  this.Invoke(new MyInvokeDelegate(this.ChangeText), o.ToString());
              }

              private void ChangeText(string name) {
                  this.textBox1.Text = name;
              }

      哦,太麻煩了,難道我每次都要定義一個委托啊,這樣可不行。

      4.使用System.Action:

      private void DoWork() {
                  WaitCallback wc = new WaitCallback(this.DoSomething);
                  ThreadPool.QueueUserWorkItem(wc, "Guozhijian");
              }

              private void DoSomething(object o) {
                  this.Invoke(new Action<string>(this.ChangeText), o.ToString());
              }

              private void ChangeText(string name) {
                  this.textBox1.Text = name;
              }

      本例傳遞一個參數,System.Action有很多個重載,可以無參數(非泛型),而最多可以有四個參數,同樣采用匿名方法,不使用泛型形式的System.Action,如下:

      private void DoWork() {
                  WaitCallback wc = new WaitCallback(this.DoSomething);
                  ThreadPool.QueueUserWorkItem(wc, "Guozhijian");
              }

              private void DoSomething(object o) {
                  this.Invoke(new Action(delegate() {
                      this.textBox1.Text = o.ToString();
                  }));
              }


      5.使用System.Func
      如果Invoke調用主窗體操作之后,還希望在調用完得到一個返回值:

      private void DoWork() {
                  WaitCallback wc = new WaitCallback(this.DoSomething);
                  ThreadPool.QueueUserWorkItem(wc, "Guozhijian");
              }

              private void DoSomething(object o) {
                  System.Func<string, int> f = new Func<string, int>(this.GetId);
                  object result = this.Invoke(f,o.ToString());
                  MessageBox.Show(result.ToString());
              }

              private int GetId(string name) {
                  this.textBox1.Text = name;
                  if (name == "Guozhijian") {
                      return 999;
                  }
                  else {
                      return 0;
                  }
              }


      result的值為 999。
      System.Func同樣有很多泛形重載,這里不贅述。

      6.關于Invoke的擁有者:Control
      本文例中都是用this來引用,這里this替換為窗體任何一個控件的句柄都是OK的,因為Control.Invoke含義是將方法委托給擁有該Control的線程去執行。

      posted @ 2016-08-16 08:37  Dsw  閱讀(591)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日本视频一两二两三区| 国产成人免费午夜在线观看| a级国产乱理伦片在线观看al| 精品国产午夜福利在线观看| 亚洲午夜精品毛片成人播放| 久久精品娱乐亚洲领先| 成人拍拍拍无遮挡免费视频| 亚洲老熟女一区二区三区| 精品国产不卡在线观看免费| 国产精品美女乱子伦高| 亚洲综合视频一区二区三区| 午夜夜福利一区二区三区| 天干天干夜天干天天爽| 亚洲国产码专区在线观看| 欧美亚洲高清日韩成人| 福利视频在线一区二区| 精品午夜福利在线视在亚洲| 国产免费高清69式视频在线观看| 无码人妻精品一区二区三区夜夜嗨 | 性色av免费观看| 看免费的无码区特aa毛片| 久久婷婷国产精品香蕉| 一本色道久久加勒比综合 | 成年女人免费碰碰视频| 亚洲午夜香蕉久久精品| 亚洲中少妇久久中文字幕| 人妻精品动漫H无码中字| 中文文字幕文字幕亚洲色| 女人香蕉久久毛毛片精品| 超碰成人人人做人人爽| 国产亚洲精品VA片在线播放| 人妻综合专区第一页| 恩施市| av鲁丝一区鲁丝二区鲁丝三区| 国产在线一区二区不卡| 国产精品成人网址在线观看 | 日本丰满熟妇hd| 亚洲日韩乱码中文无码蜜桃| 日韩欧美精品suv| 亚洲无人区一区二区三区| 精品国模一区二区三区|