2011-02-07 7 views
6

async/await 컨텍스트의 취소 토큰 대신 진행중인 비동기 작업을 취소하는 메커니즘을 사용할 수 있습니다. 이것은 언어의 명령 적 본질을 고려한 잘 설계된 결정이라고 확신하지만 모든 비동기 메소드에 취소 객체를 전달해야하는 실제 상황에서는 최소한 조금은 고통 스럽습니다. C# 커뮤니티의 또 다른 디자인 아이디어가 있거나 제안 된 취소 메커니즘이 괜찮습니까? 나는 뭔가를 놓친 것 같아.비동기/취소 메커니즘을 기다리는 중

+0

취소 토큰을 사용하는 취소 메커니즘은 비동기의 C# 5 CTP를 포함하여 방향이 바뀌는 것처럼 보입니다. http://msdn.microsoft.com/en-us/vstudio/gg316360. C# 5를 호출하지는 않지만 여기에서 C#의 "다음"버전을 나타내는 데 사용하고 있습니다. –

+0

질문에 "await"을 사용 했으므로 CTP에 익숙한 것으로 나타났습니다. 필자는 Task Parallel Library (.NET 4)의 종류가 제공하는 기능이 갈 길이라는 것을 확인했으며 Async CTP는 동일한 패러다임을 사용합니다. –

+0

관련 항목 : http://stackoverflow.com/q/4914374/60761 –

답변

4

비동기 프로세스가 비싸거나 미리 설정된 종료 조건이 없거나 외부 리소스가 관련된 경우 취소 토큰이 가장 좋습니다.

그러나 원하는 경우 간단히 "포기"할 수 있습니다. 비동기 스레드에게 처리를 중단하고 정리하도록 지시하는 대신, "시간 초과"; 완료되기를 기다리지 말고, 리스너를 분리하고, 계속 실행하십시오. 스레드가 결국 완료되면 이벤트를 확인하고 아무도 듣지 못하게하며 조용히 종료합니다. 그것은 묶는 백그라운드에서 계속 실행됩니다,

  • 중지하도록 지시하지 않는 한 비동기 프로세스가 영원히 처리를 유지할 경우 : 거꾸로 그러나 이것은 나쁜 일이 될 것입니다있는 많은 상황이있다, 단순입니다 CPU 및 기타 리소스를 종료 할 때까지 스레드가 종료됩니다.
  • 비동기 스레드가 DB 조작과 같은 취소 가능하고 가역적 인 작업 단위 (UOW)를 수행하는 경우, 사용자가 취소를 누르면 지금까지 수행 된 작업이 롤백 된 것으로 간주합니다. 듣기를 멈추고 계속 나아 간다면, 그들이 얻은 것은 그들이 취소했다고 생각한 것이 수행되었다는 것입니다.
  • 대부분의 경우 비동기 작업에는 작업에 시간이 걸리는 외부 리소스가 관련되어 있으며 적절한 정리가 필요합니다. 네트워크 소켓은 연결을 끊고, DB 연결을 닫고, 파일 잠금을 해제해야합니다. 포기할지라도이를 처리 할 필요가 없습니다. 스레드가 정상적으로 종료되도록하는 대신 일반적인 사용자 경험은 사용자가 피로를 느끼거나 작업을 취소 한 다음 다시 시도하십시오. 즉, 이전 비동기 작업에서 사용한 자원을 다시 사용하려면이 자원을 해제해야합니다.
1

비동기 작업을 취소하기 위해서는 해당 취소 토큰을 확인하고 계속 작업을 중단하는 작업이 필요하므로이 작업은 신중한 단계를 수행해야합니다. 나는. 취소 토큰은 단지 async/await 메커니즘이 아닌 구현 된 패턴 일뿐입니다.

비동기 작업이 완료 핸들이있는 단지 하나의 I/O 호출 인 경우 작업은 취소하기보다는 포기할 수 있습니다. 이는 작업이 토큰을 확인할 때까지 oppurtunity를 가질 수 없기 때문입니다. 그 전화가 다시 오면 아무 것도 얻지 못합니다.

취소 토큰을 고려할 때 먼저 취소 작업을 지원함으로써이 작업을보다 효율적으로 수행 할 수 있는지 또는 완료를 기다리지 않고 (즉, 대신 시간 초과 메커니즘 사용) 더 적합한 지 고려하십시오.

관련 문제