2014-04-13 32 views
1

我:C#任務獲得的結果或捕獲異常

public static async Task<string> httpRequest(HttpWebRequest request) 

我想做到這一點:

string rez1; 
static void test() 
    { 
     Task.Factory.StartNew(() => { 
      //How can I get result like rez1= httpRequest((HttpWebRequest)HttpWebRequest.Create("google.com"))); 
      //or catch WebException here. 
     }); 
    } 

我該怎麼辦呢? 謝謝

+0

我不明白這一點。什麼不工作或你在哪裏遇到麻煩?我發佈到StartNew()方法中的 –

+0

我無法捕捉異常 – user3378283

+0

我不是專家。但是如果'httpRequest'是'async'並不意味着你沒有自己發起任務?這個功能會爲你完成嗎? –

回答

3

你有它混合了一點點。當你的方法簽名是:

public static async Task<string> httpRequest(HttpWebRequest request) 

這意味着「這種方法是異步調用的,我會打電話給它,它會並承諾在未來完成迫在眉睫的回報。」

你應該改變你的方法是這樣的:

編輯

根據提出的意見修正的代碼。

public static Task<string> httpRequest(HttpWebRequest request) 
{ 
    return Task.Factory.Startnew(() = > { 
     return HttpWebRequest.Create("google.com") 
    } 
} 

當你的方法被標記爲異步,這意味着調用者可能會認爲這是「純粹的」異步,這意味着沒有線程執行幕後。如果你啓動了一個新的線程(就像你在這裏做的那樣,通過使用一個線程池線程),你應該明確地評論你的方法並告訴你的調用者他將啓動一個新的線程。

如果您使用.NET 4.5並可以訪問新的HttpClient類,則可以節省自己啓動新的Task。

你可以改變你的方法是這樣的:

public static async Task<string> httpRequest(HttpWebRequest request) 
{ 
    var httpClient = new HttpClient(); 
    var response = await httpClient.GetAsync("http://www.google.com") 
    var stringResult = await response.Content.ReadAsStringAsync(); 

    return stringResult; 
} 
+0

你在上面的答案中犯了一個常見錯誤。你不需要在方法體內「等待」。你可以從''ReadStringAsync''返回''''任務,並從''httpRequest''中刪除''async''聲明。 – bradgonesurfing

+1

@bradgonesurfing:*「您可以從ReadStringAsync返回'Task '結果並從'httpRequest'」*中移除異步聲明 - 這是錯誤的,您提出的更改不會進行事件編譯。你必須從'異步任務'方法中返回'string'。 – Noseratio

+0

如果不清楚我的意思,請查看此處更新的代碼。 https://gist.github.com/bradphelan/10640228。 – bradgonesurfing