2017-04-09 62 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