异常使用await HttpClient.可移植类库中的GetAsync

本文关键字:类库 GetAsync 可移植 HttpClient await 异常 | 更新日期: 2023-09-27 18:03:51

我有便携式类库(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;
        }
    }

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

我在Windows 8 Metro应用程序中使用这个库。然后我通过VS2012调试应用程序,它是可以的。但是当我创建App Package并安装它时,每次应用程序第一次启动时都会崩溃,并出现以下错误:

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"它将毫无例外地工作。

在第二次启动它总是工作。

任何建议吗?

异常使用await HttpClient.可移植类库中的GetAsync

这些包具有特定于框架的实现。你可能会遇到问题,因为你没有从Win8应用程序中引用框架特定的程序集。

你能试着从你的应用程序中引用Nuget包,看看它是否解决了这个问题吗?Nuget不会向上安装包,所以当你创建一个类库使用另一个Nuget包时,你需要手动将这个Nuget包添加到引用这个类库的项目中。

当类库通过包依赖关系打包为nupkg时,这是透明的,但是当您使用项目或二进制引用时,您需要自己做。

只是猜测,但看起来你正在得到一个异常,你没有处理,可能在一个async void方法。当await调用恢复时,它抛出异常,但因为它刚刚从await中恢复,所以调用堆栈不能反映代码中发生故障的位置。

我建议在try/catch块中包装任何async void方法的主体,该块将报告异常以及它在代码中的发生位置。这应该有助于找出问题所在。一旦你有了异常,看看它的HResult属性也可以帮助解决这个问题。

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

public ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    SimpleIoc.Default.Register<MainViewModel>(true);
}

因此,当我删除立即创建的模型时,它停止崩溃:

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

我不知道为什么,但我认为这是因为MVVM Light与微软有一些问题。Bcl, Microsoft.Bcl.Async或Microsoft.Net.Http。

希望这能帮助到一些人,比如这个问题