2012-11-09 16 views
2

我遇到了一個問題,我無法找到任何解決方案,並且我發現很難相信我是唯一出現此錯誤的人。在Webrequest和WP8中使用便攜式類庫

我有這一塊的C#代碼在便攜式類庫

static public void GetAnimeListFromWeb(ObservableCollection<AnimeViewModel> collection, string Url, string encodedLogin = "") 
    { 
     WebRequest request = WebRequest.Create(Url); 
     request.Headers["Authorization"] = encodedLogin; 

     IAsyncResult asyncResult = request.BeginGetResponse(new AsyncCallback(s => { 
      WebResponse response = (s.AsyncState as WebRequest).EndGetResponse(s); 
      XDocument doc = XDocument.Load(response.GetResponseStream()); 

      IEnumerable<AnimeViewModel> result = ParseAnimeXML(doc); 

      collection = (ObservableCollection<AnimeViewModel>)result; 

     }), request); 
    } 

當我編譯這一點,建立和代碼也可以在我寫來測試它的一小控制檯程序。但是,當在Windows Phone 8應用程序中測試時,它會崩潰

WebResponse response = (s.AsyncState as WebRequest).EndGetResponse(s); 

它引發ArgumentException。當我檢查's'變量時,它說AsyncWaitHandle給了一個NotSupportedException。

我的問題是,我該如何制定一個適用於所有平臺的正確的Webrequest?

編輯:也許是要注意,我針對.NET 4.5,SL4高,WP7是有用的更高和.NET爲Windows應用商店的應用程序

+1

我無法重現這一點。忽略這是一個紅鯡魚的AsyncWaitHandle,並且不相關(我們只是不支持等待異步結果)。這是上面的確切repro? ArgumentException實際來自EndGetResponse嗎?當您傳遞的IAsyncResult不是來自request.BeginGetResponse方法的一個IAsyncResult時,它會引發ArgumentException。 –

+0

是的,這正是它崩潰的代碼,使用不同的語法對它進行了多次測試,但它在該行上都崩潰,說AsyncWaitHandle拋出NotSupportedException –

+0

讓我們退後一步。你可以嘗試在獨立的Windows Phone 8項目中重新排除可移植類庫嗎?這是否發生在模擬器中?如果是這樣的模擬器,Windows Phone 7或Windows Phone 8? –

回答

0

在我看來,你需要使用最新的Asyc/Await概念來執行此任務,如DownloadStringAsync。因爲Async/Await是Windows 8和Windows Phone 8中唯一受支持的機制。但是,當您使用此代碼並將其構建到多個平臺時,編譯器將處理不同平臺的複雜性並生成所需的代碼。

+2

這是不正確的。 Windows Phone 8支持BeginXXX和EndXX *。這與編譯器沒有任何關係,無論使用Windows 8,Phone 8還是Portable,編譯器都會生成相同的代碼。 –

+0

感謝您的更正。我錯誤的假設。我認爲異步調用的唯一方法是異步/等待。 –

+0

如果你有一個與Windows Phone 7.5及以上的pcl你可以使用它來添加異步支持:Microsoft.Bcl.Async(http://blogs.msdn.com/b/bclteam/archive/2012/11/22/10361314的.aspx?的PageIndex = 3) – Eric