2016-10-27 3 views
2

간단한 트랜잭션을 구현해야했습니다. 이 경우 내 트랜잭션 클래스는 IDisposable 인터페이스를 구현합니다. 이렇게하면 using 문에서 트랜잭션 클래스를 사용할 수 있고 해당 범위 내에서 오류가 발생하면 트랜잭션이 처리 될 때 모든 것이 롤백됩니다. IDisposable.Dispose() 내에서 비동기 호출 사용

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

는 "물건을"또한 오류를 제기 "어떤 물건을 할"경우 지금은 다시 모든 것을 롤 일부 클라이언트/서버 연결 등

이 포함되어 있습니다.

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

아마도 비동기 작업을 호출해야하는 서버의 일부 리소스를 정리해야합니다. 그 내 질문에 리드 : 내 Dispose() 구현을 위해 aswa 키워드를 사용하여 구현 내에서 await 키워드를 사용할 수 있습니까? 아니면 동기화 컨텍스트 문제 등으로 인해 경쟁 조건을 유발할 수 있습니까?

+1

일부 흥미로운 내용은 http://blog.stephencleary.com/2013/03/async-oop-6-disposal.html – Gusdor

답변

1

Task, Task<T> 또는 기다릴 수있는 다른 구현을 반환하는 경우에만 await을 사용할 수 있습니다.

IDisposableTask Dispose() 메서드를 정의하지 않습니다. 직접 작성할 수도 있지만 using 블록을 종료 할 때 호출되지 않습니다.

리소스의 잠금 메커니즘에 따라 async void으로 경쟁 조건이 발생할 수 있습니다 (이를 피하십시오!).

2

Task.Run (...)을 호출하는 것은 어떻습니까? 지정된 작업을 ThreadPool에서 실행되도록 대기시킵니다.

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