2013-03-13 23 views
3

我有便携式类库(net40 + SL4 + win8的+ wp71)与代码:
异常使用的await HttpClient.GetAsync便携式类库

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和微软.Net.Http被引用。

我在Windows 8 Metro应用程序中使用此库。然后我通过VS2012调试应用程序,没关系。但是,当我创建应用程序包和错误安装,第一次启动,每次应用程序崩溃:

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() 

编辑:如果我注释行“数据=等待httpClient.GetStringAsync”,将工作无异常。

在第二次启动时它始终工作。

有什么建议吗?

+0

只是好奇,你为什么使用.NET 4.0下的胜8 - 我认为,赢8默认是4.5,不是吗? – Isantipov 2013-03-13 22:34:33

+1

@Isantipov可移植类库意味着它是一个可以从各种框架版本使用的库。 – svick 2013-03-13 23:03:23

+0

@svick完全正确 – KondraT 2013-03-14 13:32:31

回答

1

我已经想通了。我使用MVVM轻,所以我有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中存在一些问题。

希望这可以帮助某人,例如this question

1

只是猜测,但它看起来像你正在得到一个异常,你不处理,可能在一个异步无效的方法。当await调用恢复时,它会抛出异常,但是因为它只是从等待中恢复,调用堆栈并不能反映代码中发生故障的位置。

我会建议包装在try/catch块中的任何异步void方法的主体,它将报告异常以及它在您的代码中发生的位置。这应该有助于弄清楚什么是错误的。一旦你有例外,看看它的HResult属性也可能有助于这一点。

+0

我忘记提及它发生在“data = await httpClient.GetStringAsync”行上。所以,如果你评论它,那么它会正常工作。 – KondraT 2013-03-14 18:56:55

2

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

你可以尝试引用你的应用程序中的Nuget包,看看它是否可以解决问题吗? Nuget不会安装软件包堆栈,所以当您创建一个使用另一个Nuget软件包的类库时,您需要手动将该Nuget软件包添加到引用该类库的项目中。

当类库通过包依赖项打包为nupkg时,会发生这种情况,但是当您使用项目或二进制引用时,您需要自己做。