2017-02-01 19 views
0

SOAPアプリケーションを呼び出すために、Webアプリケーションで非同期待機を実装しようとしています。私はデータベースに呼び出しを行うときにうまく動作する依存性注入を実装しています。 私はwebserviceを呼び出すときに私は応答を取得しますが、一度クエリが存在するとデッドロックです。私は何がうまくいかないのか理解できません。私はこの非同期のものにあなたの入力を高く評価して初めてです。 これは私がコール非同期呼び出しを使用してSOAPサービスを呼び出すのを待ちます。

public void GetPersonData() 
{ 
    var persons = queryProcessor.Process(new GetPersonsWhichNeedApiCalls()); 
    var watch = System.Diagnostics.Stopwatch.StartNew(); 
    // the code that you want to measure comes here 
    SearchAPI(persons).Wait(); 
    watch.Stop(); 
    var elapsedMs = watch.ElapsedMilliseconds; 
} 

private async Task SearchAPI(IEnumerable<Person> persons) 
{ 
    var tasks = persons.Select(async eachPerson => 
    { 
     var result = await asyncQueryProcessor.ProcessAsync(new PersonSearchCall { Name = eachPerson.Name, Id = eachPerson.Id }); 
     commandProcessor.Process(new CreatePersonSearch() 
     { 
      PersonSearch = result 
     }); 
    }); 
    await Task.WhenAll(tasks); 

} 

クエリ呼び出すためにMVCアプリケーションでのサービスを呼び出しています方法です:

namespace Sample.AsyncQueries 
{ 
    public class PersonSearchCall : IQuery<PersonSearch> 
    { 
     public string Name { get; set; } 
     public int Id { get; set; } 
    } 

    public class PersonSearchCallHandler : IAsyncQueryHandler<PersonSearchCall, PersonSearch> 
    { 
     private readonly IQueryProcessor queryProcessor; 
     private readonly ICommandProcessor commandProcessor; 

     public PersonSearchCallHandler(ICommandProcessor commandProcessor, 
      IQueryProcessor queryProcessor) 
     { 
      this.queryProcessor = queryProcessor; 
      this.commandProcessor = commandProcessor; 
     } 

     public async Task<PersonSearch> HandleAsync(PersonSearchCall query) 
     { 
      var client = new PersonServiceSoapClient(); 

      var personResponses = await client.PersonSearchAsync(inputs).ConfigureAwait(false); 
      //Build the person Object 
      return person; 
     } 
    } 
} 

私は同期の方法を使用してこれを達成することができました。このシンプルインジェクタしかし、私としては人のリストを呼び出しており、各コールは約2秒かかります。私は非同期の使用を利用しようとしており、リストから複数の呼び出しを行うのを待っています。

+1

私は非常には、[この記事](https://msdn.microsoft.com/en-us/magazine/jj991977.aspx)を読んでお勧めしたいです。あなたは 'ConfigureAwait(false)'をより一貫して使用すると、非同期とブロックコードを混在させていますが、ASP.NET MVCからこれを実行している場合は、方法。 – StriplingWarrior

+0

@StriplingWarriorの記事を指摘してくれてありがとう – IRaki

+0

あなたの投稿を破壊しないでください。 Stack Exchangeネットワーク上に掲載することで、SEがそのコンテンツを配布する権利(CC BY-SA 3.0ライセンス)(https://creativecommons.org/licenses/by-sa/3.0 /))。 SEのポリシーによって、どんな破壊行為も元に戻ります。この投稿とアカウントとの関連付けを解除する場合は、[解約リクエストの正しいルートは何ですか?](https://meta.stackoverflow.com/q/323395)を参照してください。 – NobodyNada

答えて

1

StriplingWarriorがコメントしたように、問題はあなたがblocking on async codeだということです。あなたはasync all the wayを使用する必要があります。

public async Task GetPersonData() 
{ 
    var persons= queryProcessor.Process(new GetPersonsWhichNeedApiCalls()); 
    var watch = System.Diagnostics.Stopwatch.StartNew(); 
    await SearchAPI(persons); 
    var elapsedMs = watch.ElapsedMilliseconds; 
} 
関連する問題