2012-01-08 52 views
2

我調用QueryJourneys,它會對d2進行異步調用,但在嘗試使用WebClient異步地下載某些內容(XML)時會失敗。利用異步CTP並引發InvalidOperationException異常「Task_Start_NullAction」的C#代碼

我得到的異常InvalidOperationException異常以字符串「Task_Start_NullAction」作爲唯一的消息。

出了什麼問題?

調用代碼:

autoCompleteBox.ItemsSource = await OpenAPI.QueryStation(e.Parameter); 

背後拋出異常的代碼:

public static Task<IEnumerable<Journey>> QueryJourneys(
               Point from, 
               Point to, 
               DateTime lastStart) 
    { 
     string str = cs_requestResultPage(from, to, lastStart); 

     Task<IEnumerable<Journey>> t = d2(str); 
     t.Start(); 
     return t; 
    } 

    private static async Task<IEnumerable<Journey>> d2(string str) 
    { 
     var webClient = new WebClient(); 
     webClient.Encoding = Encoding.UTF8; 

     string t = await webClient.DownloadStringTaskAsync(new Uri(str)); 
     var view = new ResultPageView(XDocument.Parse(t)); 

     return view.Journeys; 

回答

4

的問題是調用Task.Start()。異步方法返回的任務不能顯式啓動 - 當方法返回時,它已經有效地進行了。您可以直接從QueryJourneys方法返回它:

public static Task<IEnumerable<Journey>> QueryJourneys(Point from, Point to, 
                 DateTime lastStart) 
{ 
    string str = cs_requestResultPage(from, to, lastStart); 
    return d2(str); 
} 

順便說一句,我強烈建議你開始給方法更有意義的名稱,以下.NET命名約定。

(作爲另一一邊,它總是值得一說方法引發了異常 - 在這種情況下,它可能Task.Start

+0

的異常被拋出在這裏。我以爲我寫了那個,而且我顯然沒有。 'string t = await webClient.DownloadStringTaskAsync(new Uri(str));' – 2012-01-08 19:53:35

+0

@RobertSundström:真的嗎?這聽起來不太可能 - 你能包括完整的堆棧跟蹤嗎?正如我所說的,我希望失敗的是調用Task.Start()。無論如何, – 2012-01-08 20:01:38

+0

。謝謝你的回答。 我很新的語法,有時它變得複雜。我真的想知道推出了一個「任務」。沒想到'await'會自動啓動它。想知道爲什麼我這麼做。沒關係。 – 2012-01-08 20:02:20