2016-07-11 6 views
2

以下、いくつかのコードを貼り付けました。私は最後の行にawaitableコールTask<IEnumerable<SkuGcn>> GetSkuGcnList();呼ん体の最初の行にこの例外に結果を取得するとき、mapPromise.GetAwaiter()にそれがスロー:非同期GetAwaiter()が奇数例外を投げる

型「System.IO.FileNotFoundException」の例外がで発生しましたSystem.Private.CoreLib.ni.dllがユーザーコードで処理されませんでした

追加情報:ファイルまたはアセンブリを読み込めませんでした 'System.Runtime.Serialization.Xml、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a '。システムは、指定されたファイルを見つけることができません。

は、私がブレークポイントを設定することができますので、GetSkuGcnList()コールがに呼び出している私のサービスは、呼び出されている知っていて、呼び出しが行われたとき、私はそれを破ります。その後、サービスは戻っているようです。

このコードはASP.NET 5 RC1でうまく動作しましたが、ASP.Net Core 1.0リリースではあまりうまくいきませんでした。

ご協力いただきますようお願い申し上げます。

 public ProductItemsCacheStore(IItemsProductCacheRepository itemsRepo, IProductAvailabilityPricing proxyGoliathApi, 
     IProductItemListRepo itemsListsRepo, IItemPricesCacheRepo itemPricesRepo) 
     { 
      var mapPromise = proxyGoliathApi.GetSkuGcnList(); 
      _items = itemsRepo.GetAllProductOrderListForCache(); 
      _itemsLists = itemsListsRepo.GetItemListsForCache(); 
      _priceZones = itemPricesRepo.GetAllPriceZonesAndItemPrices(); 
      MergeProductsWithGcn(_items, mapPromise.GetAwaiter().GetResult()); 
     } 

マイproject.jsonは次のようになります

{ 
    "version": "1.0.0-alpha.1", 
    "description": "AvailabilityPricingClient Class Library", 
    "authors": [ "irving.lennert" ], 
    "packOptions": { 
    "tags": [ "" ], 
    "projectUrl": "", 
    "licenseUrl": "" 
    }, 

    "tooling": { 
    "defaultNamespace": "AvailabilityPricingClient" 
    }, 

    "dependencies": { 
    "Microsoft.NETCore.App": { 
     "version": "1.0.0", 
     "type": "platform" 
    }, 
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", 
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", 
    "Microsoft.Extensions.Configuration.Json": "1.0.0", 
    "Microsoft.Extensions.Logging": "1.0.0", 
    "Microsoft.Extensions.Logging.Console": "1.0.0", 
    "Microsoft.Extensions.Logging.Debug": "1.0.0", 
    "Microsoft.AspNet.WebApi.Client": "5.2.3" 
    }, 

    "frameworks": { 
    "netcoreapp1.0": { 
     "imports": [ 
     "dotnet5.6", 
     "portable-net45+win8" 
     ] 
    } 
    } 
} 

GetSkuGcnList()の実装は、このている:@DaniDevは同期および非同期コードされる混合、コメント欄で述べたように

public async Task<IEnumerable<SkuGcn>> GetSkuGcnList() 
    { 
     HttpResponseMessage response = _client.GetAsync("/api/skuGcnList").Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var skuGcns = await response.Content.ReadAsAsync<IEnumerable<SkuGcn>>(); 
      return skuGcns; 
     } 

     return null; 
    } 
+0

'mapPromise.GetAwaiter()。GetResult()'は非常に奇妙です。 'ProductItemsCacheStore'を非同期にしたり、' GetSkuGcnList'を同期させてタスクを返さないことはできますか?同期と非同期を混ぜると常に問題が発生する –

+0

問題はコードではなくproject.jsonの設定であると考えています。 project.jsonからのナゲットリファレンスとランタイムの設定は、問題の根を見つけるのに役立ちます。投稿を更新できますか? – Chizh

+0

適切なWebApiクライアントアセンブリを使用しているかどうかを判断するのに苦労していますが、参照エラーが発生していません.... –

答えて

4

私が呼び出しているアセンブリがASP.Netコアリリースで正しく動作していないと判断しました。あなたは上記のproject.jsonで見れば、それはこの行です:

"Microsoft.AspNet.WebApi.Client": "5.2.3" 

私は、この行にその行を変更しました:

"System.Net.Http": "4.1.0" 

私は変更しなければならなかったので、このアセンブリは、同じAPIを公開していません。実装コード:

public async Task<IEnumerable<SkuGcn>> GetSkuGcnList() 
    { 
     HttpResponseMessage response = _client.GetAsync("/api/skuGcnList").Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var skuGcns = await response.Content.ReadAsStringAsync() 
       .ContinueWith<IEnumerable<SkuGcn>>(getTask => 
       { 
        return JsonConvert.DeserializeObject<IEnumerable<SkuGcn>>(getTask.Result); 
       }); 
      return skuGcns; 
     } 

     return null; 
    } 

このソリューションはうまくいきます。私もポストと同じ問題を抱えていたことに注意することが重要です。もう少し複雑なので、興味のある人のための投稿です。

public async Task<IEnumerable<Availablity>> GetAvailabilityBySkuList(IEnumerable<string> skuList) 
    { 
     var output = JsonConvert.SerializeObject(skuList); 
     HttpContent contentPost = new StringContent(output, System.Text.Encoding.UTF8, "application/json"); 
     HttpResponseMessage response = _client.PostAsync("/api/availabilityBySkuList", contentPost).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var avail = await response.Content.ReadAsStringAsync() 
       .ContinueWith<IEnumerable<Availablity>>(postTask => 
       { 
        return JsonConvert.DeserializeObject<IEnumerable<Availablity>>(postTask.Result); 
       }); 
      return avail; 
     } 

     return null; 
    } 

寄稿いただきありがとうございます。

1

お勧めしません。このトピックに関する標準的な記事はStephen ClearyのDon't Block on Async Codeです。

コンストラクターで非同期操作を呼び出していて、constructors can't be asyncを呼び出しているため、コードを非同期にするのはややこしいことです。あなたのコードを再構築する

一つの方法は、(呼び出し非同期)コンストラクタ(依存性注入)と初期化を分割することですコード:

public class ProductItemsCacheStore 
{ 
    private readonly IItemsProductCacheRepository _itemsProductCacheRepo; 
    private readonly IProductAvailabilityPricing _productAvailabilityPricing; 
    private readonly IProductItemListRepo _productItemListRepo; 
    private readonly IItemsPricesCacheRepo _itemsPricesCacheRepo; 

    private bool _initialized = false; 

    public ProductItemsCacheStore(
     IItemsProductCacheRepository itemsRepo, 
     IProductAvailabilityPricing proxyGoliathApi, 
     IProductItemListRepo itemsListsRepo, 
     IItemPricesCacheRepo itemPricesRepo) 
    { 
     _itemsProductCacheRepo = itemsRepo; 
     _productAvailabilityPricing = proxyGoliathApi; 
     _productItemListRepo = itemsListsRepo; 
     _itemsPricesCacheRepo = itemsPricesRepo 
    } 

    public async Task Initialize() 
    { 
     // Could possibly move these to the constructor as well 
     var _items = itemsRepo.GetAllProductOrderListForCache(); 
     var _itemsLists = itemsListsRepo.GetItemListsForCache(); 
     var _priceZones = itemPricesRepo.GetAllPriceZonesAndItemPrices(); 

     MergeProductsWithGcn(_items, await _productAvailabilityPricing.GetSkuGcnList()); 

     _initialized = true; 
    } 
} 

あなたのかかるコード(どこが前new ProductItemsCacheStore(...)を構築しました)今次のようになります。

var productItemsCacheStore = new ProductItemsCacheStore(/* dependencies */); 
await productItemsCacheStore.Initialize(); 

もちろん、消費コードも非同期でなければなりません。それはasync all the way upです。

+0

私は好きですが、誰が 'Initialize()'を呼び出すか –

+0

@IrvLennert 'ProductItemsCacheStore'を消費しているコードです。追加のコードスニペットで私の答えを更新しました。 –

+0

オクラ、ネイト、ここに私がやっていると思うことがあります。 1)私はタスク2を返す)2)3)4)stuff私は1)から答えを必要とするでしょう 、行5)私は私の答えがあるまでブロックしています。 それがあなたの解釈でない場合は、私を修正してください。ありがとう... –

関連する問題