2016-10-27 18 views
2

私は単純なトランザクションを実装する必要がありました。その場合、私のトランザクションクラスはIDisposableインターフェイスを実装します。そうすれば、usingステートメント内でトランザクションクラスを使用することができ、そのスコープ内でエラーが発生した場合、トランザクションが破棄されるとすべてがロールバックされます。IDisposable.Dispose()内の非同期呼び出しを使用

using (var transaction = new Transaction()) 
{ 
    // do some stuff 
} 

「いくつかのものをやる」も「いくつかのものをやる」いずれかのエラーが発生した場合今私は戻って、すべてをロールなど

をいくつかのクライアント/サーバ接続を含んでいます。

public async void Dispose(){ // roll back everything on error } 

おそらく、私が非同期操作を呼び出す必要があるサーバー上のいくつかのリソースをクリーンアップすることが含まれます。それは私の質問につながります:asposeキーワードを使用して、その実装内でawaitキーワードを有効にするだけで、安全にasposeキーワードをDispose()実装に使用できますか?あるいは、これはおそらく同期コンテキストの問題などのために競合状態につながる可能性がありますか?

+1

興味深い記事http://blog.stephencleary.com/2013/03/async-oop-6-disposal.html – Gusdor

答えて

1

awaitは、メソッドがTask,Task<T>またはawaitableの別の実装を返す場合にのみ使用できます。

IDisposableは、Task Dispose()メソッドを定義していません。あなたはいつでもあなた自身で書くことができますが、usingブロックを終了するときには呼び出されません。

リソースのロックメカニズムによっては、async voidの競合状態が発生する危険性があります(避けてください)。

2

Task.Run(...)の呼び出しはどうですか?指定された作業をThreadPoolで実行するようにキューに入れます。

public void Dispose() 
    { 
     if (_thereWasAnError) 
     { 
      Task.Run(async() => await RollbackAsync()).Wait(); 
     } 
    } 
関連する問題