3

コード付きのポータブルクラスライブラリ(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 でアプリをデバッグしますが、問題ありません。しかし、アプリ パッケージを作成してインストールすると、最初の起動時にアプリが毎回エラーでクラッシュします。

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」という行にコメントを付けると、例外なく機能します。

2回目の起動では、常に機能します。

なにか提案を?

4

3 に答える 3

2

これらのパッケージには、フレームワーク固有の実装があります。Win8 アプリからフレームワーク固有のアセンブリを参照していないため、問題が発生している可能性があります。

アプリケーションから Nuget パッケージを参照して、問題が解決するかどうかを確認できますか? Nuget はパッケージをアップスタックでインストールしないため、別の Nuget パッケージを使用するクラス ライブラリを作成するときは、クラス ライブラリを参照するプロジェクトにその Nuget パッケージを手動で追加する必要があります。

これは、クラス ライブラリがパッケージの依存関係を通じて nupkg としてパッケージ化されている場合は透過的に発生しますが、プロジェクトまたはバイナリ参照を使用している場合は、自分で行う必要があります。

于 2013-03-15T02:49:44.190 に答える
1

推測ですが、おそらく async void メソッドで、処理していない例外が発生しているようです。await 呼び出しが再開されると、例外がスローされますが、await から再開されたばかりであるため、コードのどこでエラーが発生しているかがコール スタックに反映されません。

例外とそれが発生しているコード内の場所を報告する try/catch ブロックにある async void メソッドの本体をラップすることをお勧めします。これは、何が間違っているかを理解するのに役立ちます。例外が発生したら、その HResult プロパティを調べることもこれに役立つ場合があります。

于 2013-03-14T18:06:46.747 に答える
1

私はそれを理解しました。私は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 に問題があるためだと思います。

これが誰かを助けることを願っています、例えばこの質問

于 2013-03-15T15:07:06.233 に答える