0

私はこれらのスレッドを覚えていて、同期タスクと非同期タスクの作成を混同しています。コードの一部を書きましたが、うまくいきません。同期タスクが動作しない

私はそれが簡単な質問かもしれないが、本当に私が概念を得るのを助けることを知っている。

私が望むもの - 同期タスク1は、同期タスク2と同期タスク3が非同期である場合にのみデータを与える必要があります。

また、誰かが助けてくれればスレッドではなくスレッドでやりたいと思っています。

ありがとうございます。

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

public class Example 
{ 
    public static void Main() 
    { 

     var syncTask1 = Task.Factory.StartNew(() => 
     { 


      for (int ctr = 1; ctr <= 10; ctr++) 
       Console.WriteLine(ctr.ToString() + "1"); 
     }); 
     var syncTask2 = new Task(() => 
     { 


      for (int ctr = 1; ctr <= 10; ctr++) 
      { 
       Console.WriteLine(ctr.ToString() + "2"); 

      } 


     }); 
     syncTask2.Start(); 

     var syncTask3 = Task.Factory.StartNew(() => 
     { 


      for (int ctr = 1; ctr <= 10; ctr++) 

      Console.WriteLine(ctr.ToString() + "3"); 
     }); 


     // syncTask.RunSynchronously(); 


     Console.ReadLine(); 
    } 
} 
+1

これらのタスクはすべて非同期で、すべてがメインスレッドとは別のスレッドで実行されます。タスクにシーケンスが必要な場合は、シーケンスにシーケンスを設定します。 'await'、' ContinueWith'です。最後に、 'RunSynchronously'はあなたが思うことをしません(私は名前が混乱していることに同意します)。 - ドキュメントを読んでください。 – Luaan

+0

ありがとう、私は非同期を使用したいと思いませんし、サポートするために.netフレームワークのバージョンが必要ないため、待っています。それは私が学んでいるので、他の方法を知りたいからです。 – vic90

+0

もしあなたが 'Task'を持っていれば、あなたは' await'も持っています。どちらも同じ.NETバージョンが必要です。 'await'はコンパイラーのものです。Async Targeting Packを使用して、.NET 4.0に" await "をバックポートすることができます。まだ 'await'を避けたいのであれば(特にあなたが何をやっているのかわからないときは)、' ContinueWith' *は他の方法です - 4.0でネイティブにサポートされている方法と、 'await'のないタスクに対する非同期ワークフローを扱います。 – Luaan

答えて

0

同期タスクと非同期タスクはありません。タスクを同期または非同期に呼び出す(または待機させる)ことはできますが、タスクは同じです。

Task t = Task.Factory.StartNew(() => 
{ 
    for (int ctr = 1; ctr <= 10; ctr++) 
     Console.WriteLine(ctr.ToString() + "1"); 
}); 

t.Wait(); // waiting task synchronously 

あなたは非同期タスクを待ちたい場合は:あなたが同期タスクを待ちたい場合は、単純にやるべき

Task t = Task.Factory.StartNew(() => 
{ 
    for (int ctr = 1; ctr <= 10; ctr++) 
     Console.WriteLine(ctr.ToString() + "1"); 
}); 

await t; // waiting task asynchronously 

が、この場合には、あなたはasyncとして、あなたの方法をマークしなければなりません - (async await usage

例では、2番目と3番目の後に最初に待機するようにしてください。

public static void Main() 
{ 
    var syncTask2 = Task.Factory.StartNew(() => 
    { 
     for (int ctr = 1; ctr <= 10; ctr++) 
      Console.WriteLine(ctr.ToString() + "2"); 
    }); 

    syncTask2.Wait();// wait for second task finishing synchronously   

    var syncTask3 = Task.Factory.StartNew(() => 
    { 
     for (int ctr = 1; ctr <= 10; ctr++) 
      Console.WriteLine(ctr.ToString() + "3"); 
    }); 

    syncTask3.Wait(); // wait for third task finishing synchronously after second 

    var syncTask1 = Task.Factory.StartNew(() => 
    { 
     for (int ctr = 1; ctr <= 10; ctr++) 
      Console.WriteLine(ctr.ToString() + "1"); 
    }); 

    syncTask1.Wait(); // wait for third task finishing synchronously after second and third 

    Console.ReadLine(); 
}   
+0

Great Thanks Sir.Just 1つの質問.Task.waitall(synctask2、syncTask3)は、syncTask2とSyncTask3が完了するのを待つことを意味します。syncTask2の後にsyncTask3がどのように確実に実行されますか? synctask2の後にsynctask3を開始したか、またはTask.waitall(SyncTask2、syncTAsk3? – vic90

+0

@ vic90のSyncTask2の後にsyncTask3を書き込んだので、2番目のタスクを最初に完了し、次に3番目にしてから最初に実行しますか? –

+0

はいサー – vic90

関連する問題