2014-10-06 347 views
-1

有異步方法FuncAsync和任務對象t。 兩者都在做同樣的事情,都使用線程池。 這兩種策略有什麼區別?異步任務vs任務

class Program 
{ 
    private static async Task<int> FuncAsync(string str) 
    { 
     string s = await Task.Run(() => 
     { 
      Console.WriteLine("{0} <- Pooled? ID -> {1}", Thread.CurrentThread.IsThreadPoolThread, Thread.CurrentThread.ManagedThreadId); 
      // Thread.Sleep(1000); 
      return str; 
     }); 
     return s.Length; 

    } 

    public static void Main(string[] args) 
    { 
     Task<int> z = FuncAsync("Text"); 
     Console.WriteLine(z.Result); 
     Task<int> t = Task.Run(() => 
     { 
      Console.WriteLine("{0} <- Pooled? ID -> {1}", Thread.CurrentThread.IsThreadPoolThread, Thread.CurrentThread.ManagedThreadId); 
      // Thread.Sleep(1000); 
      return "Text".ToString().Length; 
     }); 
     Console.WriteLine(t.Result); 
     Thread.CurrentThread.Join(1000); 

     Console.ReadLine(); 

    } 
} 

我認爲,隨着異步方式等待結果,並不能接近完成沒有任務, 與任務 - 線程被背景和可能沒有完成任務被關閉。

+0

沒有太多,除非您有'任務'的情況下使用匿名方法和更多管道代碼。 – Mrchief 2014-10-06 14:07:37

+4

聽起來像你只是需要閱讀'async/await'的介紹教程。 – Servy 2014-10-06 14:15:26

+1

@Servy我認爲是)) – 2014-10-06 14:21:32

回答

0

一個是可重用的函數,另一個不是。一個將字符串長度傳回線程,另一個傳遞整個字符串。因爲您立即要求.Result阻塞,直到任務完成(您應該使用await代替)

+0

他不能在'Main'內使用'await'。 – 2014-10-06 14:12:02

+1

是的,但他不應該打擾Task.Run後立即task.Result要麼:) – 2014-10-06 14:13:26

+0

真的......真的:)我不認爲他的代碼有太多的意義。 – 2014-10-06 14:13:57