2017-08-14 37 views
-1

我有這樣的對象未能趕上從Task.Factory.FromAsync

public class ObjectList 
{ 
    public string idreturn { get; set; } 
} 

雖然與Task.Factory.FromAsync運行的異步請求的響應,我沒有趕上響應

foreach (var obj in ObjectList) 
{ 
    var wreq = (HttpWebRequest)WebRequest.Create(Convert.ToString(getURL)); 
    var taskResp = Task.Factory.FromAsync<WebResponse>(wreq.BeginGetResponse, wreq.EndGetResponse, null); 
    taskResp.ContinueWith(tsk => new StreamReader(tsk.Result.GetResponseStream()).ReadToEnd().Trim()) 
      .ContinueWith((Task<string> trs) => { 
       obj.idreturn = trs.Result.ToString(); 
      }); 
} 

return JsonHelper.JsonSerializer(ObjectList); 

我是什麼失蹤?

+0

您是否收到異常?如果是,請包含異常詳細信息/堆棧跟蹤。 – Subbu

回答

0

您正在開始一個異步操作,然後繼續並在異步操作完成之前序列化對象。

而不是使用ContinueWith你應該await值從FromAsync返回得到的結果,這樣的代碼的其餘部分將不會繼續,直到請求完成後。如果您希望所有請求都並行發生,您可以構建所有任務,然後在請求全部完成後運行序列化代碼。

+0

我應該如何在這段代碼中實現「等待」? for: var taskResp = await Task.Factory.FromAsync (wreq.BeginGetResponse,wreq.EndGetResponse,null); 出現錯誤:錯誤CS4032 'await'操作符只能在異步方法中使用。考慮使用'async'修飾符標記此方法,並將其返回類型更改爲'任務'.WebRequestCLR.sqlproj –

+0

@YanivBenYohana如果您不熟悉它,則應該閱讀有關該主題的教程。涵蓋你需要知道的所有內容超出了單個SO回答的範圍。您擁有的代碼代碼正是您需要做的,是的,代碼中的錯誤告訴您需要更改哪些內容。 – Servy