2017-04-09 17 views
0
class Program 
{ 
    static void Main(string[] args) 
    { 
     var rst = DownloadPage("http://www.baidu.com"); 
     //var rst2=GetString(); 

     Console.ReadKey(); 
    } 

    private static async Task<string> DownloadPage(string url) 
    { 
     using (var client = new HttpClient()) 
     { 
      PringMsgWithThreadId("Before await"); 
      var response = await client.GetAsync(url).ConfigureAwait(continueOnCapturedContext:false); 
      var content= await response.Content.ReadAsStringAsync(); 

      PringMsgWithThreadId(content.Substring(0, 10)); 
      PringMsgWithThreadId("After await"); 
      return content; 
     } 
    } 

    private static async Task<string> GetString() 
    { 
     PringMsgWithThreadId("Before await"); 
     var result = await GetStringAsync(); 

     PringMsgWithThreadId(result); 
     PringMsgWithThreadId("After await"); 
     return result; 
    } 

    private static Task<string> GetStringAsync() 
    { 
     var task = new Task<string>(() => 
      { 
       Thread.Sleep(1000 * 2); 
       return "string after sleep two seconds"; 
      }); 
     task.RunSynchronously(); 
     return task; 
    } 

    private static void PringMsgWithThreadId(string tag) 
    { 
     Console.WriteLine($"{tag}(ThreadId:{Thread.CurrentThread.ManagedThreadId})"); 
    } 
} 

輸出時運行DownloadPage()方法輸出:運行時爲什麼等待有時創建新的線程,但有時不是?

enter image description here

輸出getString()方法

enter image description here

我的問題:

1.當通話DownloadPage(),爲什麼代碼在執行後在線程中執行(ThreadID:15)其他比主線程(ThreadId:10)。

2.當調用GetString的(),爲什麼代碼後伺機在同一個線程執行(兩者的threadId爲10)。

+0

用什麼語言? –

回答

8

await從未創建一個新線程。

正如在我的async intro,await上解釋的,我們將首先檢查它的論點(任務)。如果它已經完成,則它繼續同步執行。否則,它會「暫停」該方法並用其參數註冊一個回調(即對該任務進行延續)。

稍後,當任務完成時,將繼續運行。由於您在沒有SynchronizationContext/TaskScheduler的控制檯應用程序中,該延續將在線程池線程上運行。

因此,第一個問題的答案是主線程忙(在Console.ReadKey中被阻塞),並且控制檯應用程序中的主線程也不是線程池線程。第二個問題的答案是因爲GetStringAsync中的任務同步運行並且在它返回時已經完成,並且這導致GetString中的await繼續(同步)。

在附註上,永遠不要使用任務構造函數。如果要返回已完成的任務,請使用Task.FromResult。如果您想在後臺線程上執行某些工作,請使用Task.Run

+0

謝謝!你的回答和文章讓我很不理解異步/等待。 – york

相關問題