2017-10-29 5 views
2

Microsoft hereのC#スレッディングタスク命令を使用しています。C#スレッディングタスクの明確化

彼らは最後の状態:

Resultプロパティ・ブロック呼び出し元のスレッドをタスクが終了するまで。

私は、これは関数のスレッドを作成しているにもかかわらず、メインスレッドと、呼び出し元関数の進行を保持していると考えていますか?それが作成し、同時に両方のスレッドを実行します

using System; 
using System.Linq; 
using System.Threading.Tasks; 

class Program 
{ 
    static void Main() 
    { 
     // Return a value type with a lambda expression 
     Task<int> task1 = Task<int>.Factory.StartNew(() => 1);    

     // Return a named reference type with a multi-line statement lambda. 
     Task<Test> task2 = Task<Test>.Factory.StartNew(() => 
     { 
      string s = ".NET"; 
      double d = 4.0; 
      return new Test { Name = s, Number = d }; 
     }); 

     int i = task1.Result; 
     Test test = task2.Result;  
    } 
} 

、返す前に、関数を使って実行されている:第二の問題として

、私は例のコードを変更した場合、私の可能性が間違った最初の仮定から続きます仕事?それとも、私が当初想定していたようにスレッドを1度進めていくのだろうか?

+0

Microsoftの例では、本質的にそれらの関数を同期的に呼び出すことになります。あなたの例では、 'StartNew'を呼び出すと、同時に実行されます。両方が生成されると、メインスレッドは最初のスレッドが終了するのを待ってから、2番目のスレッドが終了してその順番で結果を収集します。 – hnefatl

+0

ありがとう、それは完璧です、あなたは答えとしてそれを追加する必要があります:) – SoulRider

答えて

2

そうだね、マイクロソフトの例は、本質的に、同期これらの機能を呼び出します。

... 
Task<int> task1 = Task<int>.Factory.StartNew(() => 1); 
int i = task1.Result; 

Task<Test> task2 = Task<Test>.Factory.StartNew(() => 
{ 
    string s = ".NET"; 
    double d = 4.0; 
    return new Test { Name = s, Number = d }; 
}); 
Test test = task2.Result; 
... 

task1は、その結果を返すまで、現在のスレッドがブロックされ、新しいスレッドで開始されます。次にtask2は新しいスレッドで開始されます...

たとえば、それらは同時に実行されます。 task1が生成された後にtask2となると、メインスレッドはtask1の結果を待ってからtask2の結果を待ちます。