2016-10-19 5 views
0

私は、Azureに格納されているサンプルdocumentDBを使用するために、MSDNのガイドに従って単純なアプリケーションを構築しました。私のコンソールアプリケーションからASP.NET C#Azure documentDbクラスライブラリが動作しない

私は(クラスライブラリプロジェクトで)このメソッドを実行することができ、すべてがokです:

private static async Task CreateDatabaseIfNotExistsAsync(string DatabaseId) 
{ 
    try 
    { 
     await client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(DatabaseId)); 
    } 
    catch (DocumentClientException e) 
    { 
     if (e.StatusCode == System.Net.HttpStatusCode.NotFound) 
     { 
      await client.CreateDatabaseAsync(new Database { Id = DatabaseId }); 
     } 
     else 
     { 
      throw; 
     } 
    } 
} 

しかし、私はASP.NETアプリケーションから同じクラスライブラリを使用すると、プログラムが停止します(例外、その他の例外はありません)。ReadDatabaseAsyncメソッド呼び出し。

私はすでに非同期呼び出しを変更しようとしました...運がない。

+1

呼び出しコードとは何ですか?これはブロックし、 'CreateDatabaseIfNotExistsAsyncs.Wait()'のようなことをしますか? –

+0

@Gabiはい、メソッドは によって呼び出されます。CreateDatabaseIfNotExistsAsync(Databasename).Wait(); – Jack

+0

これは、ASP.NETでデッドロックを引き起こす可能性があります。 [here](http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html)を参照してください。 したがって、上記のコードで待ち状態の呼び出しで '.ConfigureAwait(false)'を使用するか、 'CreateDatabaseIfNotExistsAsync'呼び出しを' Task.Run'でラップしてください。 'Task.Run(()=> CreateDatabaseIfNotExistsAsync(Databasename))。Wait()' –

答えて

0

Gabiが上記のコメントに答えたので、簡単に見つけやすくするためにこちらの回答に変換してください。 This video by the ASP.NET team has good information on using async in ASP.NET。 完全に非同期にすることをお勧めします(呼び出しコードを待つように変更してください)。 ASP.NETで.Wait()を呼び出さないでください。

ただし、何らかの理由でWait()を実行する必要がある場合は、上記のコードで非同期呼び出しに.ConfigureAwait(false)を使用してください。

await client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(DatabaseId))。ConfigureAwait(false);

関連する問題