2014-11-24 213 views
0

我想有一個異步調用的函數如下:C#異步方法調用

我會從主方法調用一個方法,這個功能應該是異步的,我該怎麼辦呢?

一個小例子:

private static void Main(string[] args) 
{ 
    StartDoingNothingAsync(); 
    Console.WriteLine("test"); 
    Console.Read(); 
} 

private static async void StartDoingNothingAsync() 
{ 
    for (var i = 0; i < 5000; i++) 
    { 
     //do something 
    } 
    Console.WriteLine("leaved"); 
} 

我會先輸出「測試」,「闊葉」之前,我該怎麼練呢?

回答

0

最簡單的辦法是將延遲引入您的異步方法:

private static async void StartDoingNothingAsync() 
{ 
    await Task.Delay(1000); 
    // This will be called on a thread-pool thread 
    Console.WriteLine("leaved"); 
} 

不會保證testleaved之前打印出來,但似乎不太可能。如果你真的想要保證,你必須通過StartDoingNothingAsync,然後打印test ......然後你信號......但它並不真正清楚你試圖達到什麼。

請注意,異步方法應該差不多從不void - 基本上這隻適用於允許異步事件處理程序。使方法返回Task而不是 - 這樣,您的調用代碼可以告訴它何時完成。 (即使你不使用實際上在這種情況下,這是一個好習慣進入。)

現在我們有關於你想達到什麼樣的多一點信息,我會建議使StartDoingNothingAsync異步方法 - 只需使用一個任務來代替:

private static void Main(string[] args) 
{ 
    Task task = Task.Run(DoSomething); 
    Console.WriteLine("test"); 
    task.Wait(); 
    Console.Read(); 
} 

static void DoSomething() 
{ 
    // Code to run on a separate thread 
} 
+0

有了這個,我會實現,即「StartDoing ...」方法是完全異步的。在這種方法中,我會做一些需要很長時間的人員,例如寫一個大文件。主函數中的代碼應該在一個線程中執行,並且「StartDoing ...」應該在另一個線程中執行。我將減少主函數中的阻塞代碼 – 2014-11-24 08:34:28

+0

@MarcelHoffmann:如果您實際上只想開始一個單獨的任務,請使用「Task.Run」。使用'async' *將會使用一個線程池線程(在這種情況下),但是隻有在第一個「await」之後需要安排一個延續。使用'Task.Run'會更清晰。 – 2014-11-24 08:58:26

+0

感謝與任務tipp。其實我有一個問題。任務和異步/等待之間有什麼不同,我應該在哪裏使用哪些?感謝以前的答覆。 – 2014-11-24 09:42:23

0

你可以像下面這樣做

private static void Main(string[] args) 
    { 
     StartDoingNothingAsync(); 
     Console.WriteLine("test"); 
     Console.Read(); 
    } 

    private static async void StartDoingNothingAsync() 
    { 
     await Task.Run(async delegate() 
     { 
      for (var i = 0; i < 5000; i++) 
      { 
       //do something 
      } 
      Console.WriteLine("leaved"); 
     }); 
    } 
0

可以使用任務了點。在這種情況下,你不需要將你的函數標記爲async:

private static void Main(string[] args) 
    { 
     new Task(StartDoingNothing).Start(); 
     Console.WriteLine("test"); 
     Console.Read(); 
    } 

    private static void StartDoingNothing() 
    { 
     for (var i = 0; i < 5000; i++) 
     { 
      //do something 
     } 
     Console.WriteLine("leaved"); 
    }