2016-05-16 95 views
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

如果你有'任务',你也有'等待'。两者都需要相同的.NET版本,'await'只是一个编译器的东西 - 您可以使用Async Targetting Pack将“await”“回溯”到.NET 4.0。如果你仍然想避免“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

在你的例子中 - 等待第二和第三后,你应该这样做:

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

非常感谢Sir.Just one question.Task.waitall(synctask2,syncTask3)表示Pgm等待syncTask2和SyncTask3完成。但它如何确保syncTask3在syncTask2之后运行?是因为我们在synctask2之后启动了synctask3,或者因为我们在Task.waitall中的SyncTask2之后写入了syncTask3(SyncTask2,syncTAsk3? – vic90

+0

@ vic90,您希望第二个任务先完成,然后是第三个,然后再完成第一个任务?) –

+0

Yes Sir 。它会帮助我理解流程。 – vic90