2017-09-19 14 views
0

私はプログラムから2つの方法を得ました。thread.name私のコードで2つの異なる答えを与えてください

まず:

namespace FirstTheard 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      this.StartPosition = FormStartPosition.CenterScreen; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Thread T1 = new Thread(new ThreadStart(DoWork)); 
      T1.Name = "Primery Thread"; 
      T1.Start(); 

     } 

     private void DoWork() 
     { 
      var threadName = Thread.CurrentThread.Name; 
      for (int i = 0; i <= 20; i++) 
      { 
       Invoke(new Action(() => 
       { 
        label1.Text += "ThreadName is-------"+threadName+"\n"; 
       })); 
       Thread.Sleep(100); 
      } 

     } 
    } 
} 

出力:
のthreadNameがある-------

第二次スレッド:

namespace FirstTheard 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      this.StartPosition = FormStartPosition.CenterScreen; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Thread T1 = new Thread(new ThreadStart(DoWork)); 
      T1.Name = "Primery Thread"; 
      T1.Start(); 

     } 

     private void DoWork() 
     { 
      //var threadName = Thread.CurrentThread.Name; 
      for (int i = 0; i <= 20; i++) 
      { 
       Invoke(new Action(() => 
       { 
        label1.Text += "ThreadName is-------"+ Thread.CurrentThread.Name + "\n"; 
       })); 
       Thread.Sleep(100); 
      } 

     } 
    } 
} 

出力:
スレッド名は-------

なぜ2つの出力が異なるのですか?

+4

'ので、' 'Invoke'''は別のスレッドでのコードのあなたの部分を実行します。 – tym32167

答えて

7

Thread.CurrentThread.Nameはあなたにこのプロパティを読み込み、スレッドの名前を与え、私を助けてください。

最初のケースでは、作成したスレッドT1でこのプロパティにアクセス(読み取り)します。 2番目のケースでは、UIスレッドのプロパティにアクセスします(Invokeから呼び出しているため)。また、メインUIスレッドの名前を設定していないので、このプロパティは空の文字列を返します。

1

Invokeは、UIスレッドに制御を戻します。第二のサンプルでは、​​あなたがこのような場合には、メインとなり、InvokeThread.CurrentThread.Nameに、アクセスしているのに対し、最初のサンプルで

1

は、あなたがt1.Name

すなわちスレッドt1Thread.CurrentThread.Name にアクセスしていますGUI /イベントスレッド。名前はありません。覚えておいてください、Invokeは、コントロールの基になるウィンドウハンドルを所有するスレッドで、指定されたデリゲートを実行します。

0

私は は皆

このコードは、私の手段

namespace FirstTheard 

{ 公共部分クラスのForm1示してありがとうござい理解と思う:フォーム { 公共の文字列をCurrentThread。 public Form1() { InitializeComponent();

 this.StartPosition = FormStartPosition.CenterScreen; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //Position of thread now is "Primery Thread" 
     CurrentThread = Thread.CurrentThread.Name= "Primery Thread"; 
     label1.Text = CurrentThread + "\n"; 
     Thread T1 = new Thread(new ThreadStart(DoWork)); 
     T1.Name = "Secondery Thread"; 
     T1.Start(); 
    } 

    private void DoWork() 
    { 
     //Position of thread now is "Secondary Thread" or T1 
     var threadName = Thread.CurrentThread.Name; 
     for (int i = 0; i <= 20; i++) 
     { 
      Invoke(new Action(() => 
      { 
       //Position of thread now is "Primery Thread" again 
       label1.Text += "ThreadName at T1 is-------"+ threadName + "   " + "ThreadName in the Invoke is-------" + Thread.CurrentThread.Name+ "\n"; 
      })); 
      Thread.Sleep(100); 
     } 

    } 

} 

}

関連する問題