2016-10-27 42 views
2

我需要實現一個簡單的事務。對於這種情況,我的事務類實現了IDisposable接口。這樣我可以在using語句中使用我的事務類,並且如果在該範圍內發生任何錯誤,那麼在事務處理完成後,所有事情都會回滾。在IDisposable.Dispose()中使用異步調用

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

的「做一些東西」還包括一些客戶端/服務器連接等

現在我回滾一切,如果「做一些東西」提出的任何錯誤。

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

這可能包括清理服務器上的一些資源,我需要調用異步操作。這導致我的問題:我可以安全地使用我的Dispose()實現的async關鍵字在其實現中啓用await關鍵字嗎?或者可能由於同步上下文問題或類似情況導致競爭條件?

+1

一些有趣的閱讀http://blog.stephencleary.com/2013/03/async-oop-6-disposal.html – Gusdor

回答

1

當方法返回Task,Task<T>或其他等待執行時,您只能使用await

IDisposable沒有定義Task Dispose()方法。您可以隨時編寫自己的文件,但是當您退出using區塊時將不會調用它。

根據您資源中的鎖定機制,您可能會冒險與async void競爭(避免這些!)。

2

如何調用Task.Run(...)。它將指定的工作排隊在ThreadPool上運行。

public void Dispose() 
    { 
     if (_thereWasAnError) 
     { 
      Task.Run(async() => await RollbackAsync()).Wait(); 
     } 
    }