簡體   English   中英

在可移植類庫中使用等待HttpClient.GetAsync的異常

[英]Exception using await HttpClient.GetAsync in Portable Class Library

我有可移植類庫(net40 + sl4 + win8 + wp71),代碼如下:

    public static async Task<Dictionary<string, FeedItem>> GetFeeds()  
    {  
        try
        {
            string data;
            using (HttpMessageHandler handler = new HttpClientHandler())
            {
                using (HttpClient httpClient = new HttpClient(handler))
                {
                    data = await httpClient.GetStringAsync(FeedsUrl + Guid.NewGuid()).ConfigureAwait(false);
                }
            }

            if (data != null)
            {
                //...
            }
            return null;
        }
        catch
        {
            return null;
        }
    }

引用了Microsoft.Bcl,Microsoft.Bcl.Async和Microsoft.Net.Http。

我在Windows 8 Metro應用程序中使用此庫。 然后我通過VS2012調試app,沒關系。 但是當我創建應用程序包並安裝它時,應用程序每次首次啟動時都會崩潰並出現錯誤:

Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Runtime.InteropServices.COMException
Stack:
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__1(System.Object)
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

編輯:如果我評論行“data = await httpClient.GetStringAsync”它將毫無例外地工作。

在第二次發布時,它始終有效。

有什么建議嗎?

這些包具有特定於框架的實現。 您可能遇到問題,因為您沒有從Win8應用程序引用特定於框架的程序集。

您是否可以嘗試從應用程序中引用Nuget包,看看它是否可以解決問題? Nuget不會向上堆棧安裝包,因此當您創建一個使用另一個Nuget包的類庫時,您需要手動將該Nuget包添加到引用該類庫的項目中。

當類庫通過包依賴性打包為nupkg時,這會透明地發生,但是當您使用項目或二進制引用時,您需要自己完成。

只是猜測,但看起來你得到一個你沒有處理的異常,可能是在async void方法中。 當await調用恢復時,它會拋出異常,但由於它剛從await恢復,因此調用堆棧不會反映代碼中發生故障的位置。

我建議在try / catch塊中包裝任何異步void方法的主體,該方法將報告異常以及代碼中的位置。 這應該有助於找出問題所在。 一旦你有異常,查看它的HResult屬性也可能有助於此。

我已經明白了。 我使用MVVM Light,所以我有ViewModelLocator代碼:

public ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    SimpleIoc.Default.Register<MainViewModel>(true);
}

因此,當我立即刪除模型時,它停止了崩潰:

SimpleIoc.Default.Register<MainViewModel>(/*true*/);

我不知道為什么,但我認為這是因為MVVM Light在Microsoft.Bcl,Microsoft.Bcl.Async或Microsoft.Net.Http方面存在一些問題。

希望這會幫助某人,例如這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM