2017-03-27 81 views
0
class Program 
{ 
    static void Main(string[] args) 
    { 
     Class1 testcla = new Class1(); 
     testcla.test(); 
    } 
} 

class Class1 
{ 
    public void test() 
    { 
     test1(); 
    } 

    public async void test1() 
    { 
     await test2(); 
    } 

    public async Task<string> test2() 
    { 
     WebClient testwc = new WebClient(); 
     var content = await testwc.DownloadStringTaskAsync("www.yahoo.com"); 
     return content; 
    } 
} 

嗨, 我需要等待DownloadStringTaskAsync完成下載的內容,但是當它執行的路線,它退出沒有任何錯誤。執行退出時命中等待DownloadStringTaskAsync

請建議

+2

你應該先把它作爲'「http://www.yahoo.com」'因爲它是一個合適的uri,但是......是的,你沒有做任何有test2結果的東西,你期望它做什麼?而且你在同步過程中運行它,所以在這裏不需要異步。 – Dispersia

+0

你的'async void test1()'立即返回,即使它啓動了'test2()'的任務。由於您沒有強制應用程序等待結果,因此應用程序正常退出。 –

+0

@BerinLoritsch無論如何改善讓它等待結果?請指教。謝謝。 Test2應將字符串結果傳遞迴test1以進行計算 –

回答

0

請嘗試以下代碼。正如@Dispersia提到的那樣,url應該包含http,https,ftp等。 您的代碼必須等待async任務完成。對於初學者,以下說明將幫助您瞭解async。 看看main()方法,它只是運行一個任務,這就是全部。 main()不依賴任何async任務的結果值,它結束並且應用程序關閉。 Async任務即DownloadStringTaskAsync()需要花費很多時間才能完成,但是從WebClient收到結果時,main方法結束執行並關閉應用程序。因此你永遠不會看到任何結果。

我已對main函數進行了更改,以等待輸入被按下。等待DownloadStringTaskAsync完成後,您將在輸出窗口中看到內容長度。然後你可以按回車鍵

static void Main(string[] args) 
{ 

    Class1 testcla = new Class1(); 
    testcla.test(); 

    Console.WriteLine("Wait for async task to finish."); 
    Console.ReadLine(); 
} 

class Class1 
{ 
    public void test() 
    { 
     test1(); 
    } 

    public async void test1() 
    { 
     await test2(); 
    } 

    public async Task<string> test2() 
    { 
     try 
     { 
      WebClient testwc = new WebClient(); 
      var content = await testwc.DownloadStringTaskAsync("http://www.yahoo.com"); 
      Console.WriteLine("Length of content received: " + content.Length.ToString()); 
      return content; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      return null; 
     } 
     finally 
     { 
      Console.WriteLine("Async task done. Press enter to exit."); 
     } 
    } 
}