async/await 컨텍스트의 취소 토큰 대신 진행중인 비동기 작업을 취소하는 메커니즘을 사용할 수 있습니다. 이것은 언어의 명령 적 본질을 고려한 잘 설계된 결정이라고 확신하지만 모든 비동기 메소드에 취소 객체를 전달해야하는 실제 상황에서는 최소한 조금은 고통 스럽습니다. C# 커뮤니티의 또 다른 디자인 아이디어가 있거나 제안 된 취소 메커니즘이 괜찮습니까? 나는 뭔가를 놓친 것 같아.비동기/취소 메커니즘을 기다리는 중
6
A
답변
4
비동기 프로세스가 비싸거나 미리 설정된 종료 조건이 없거나 외부 리소스가 관련된 경우 취소 토큰이 가장 좋습니다.
그러나 원하는 경우 간단히 "포기"할 수 있습니다. 비동기 스레드에게 처리를 중단하고 정리하도록 지시하는 대신, "시간 초과"; 완료되기를 기다리지 말고, 리스너를 분리하고, 계속 실행하십시오. 스레드가 결국 완료되면 이벤트를 확인하고 아무도 듣지 못하게하며 조용히 종료합니다. 그것은 묶는 백그라운드에서 계속 실행됩니다,
- 중지하도록 지시하지 않는 한 비동기 프로세스가 영원히 처리를 유지할 경우 : 거꾸로 그러나 이것은 나쁜 일이 될 것입니다있는 많은 상황이있다, 단순입니다 CPU 및 기타 리소스를 종료 할 때까지 스레드가 종료됩니다.
- 비동기 스레드가 DB 조작과 같은 취소 가능하고 가역적 인 작업 단위 (UOW)를 수행하는 경우, 사용자가 취소를 누르면 지금까지 수행 된 작업이 롤백 된 것으로 간주합니다. 듣기를 멈추고 계속 나아 간다면, 그들이 얻은 것은 그들이 취소했다고 생각한 것이 수행되었다는 것입니다.
- 대부분의 경우 비동기 작업에는 작업에 시간이 걸리는 외부 리소스가 관련되어 있으며 적절한 정리가 필요합니다. 네트워크 소켓은 연결을 끊고, DB 연결을 닫고, 파일 잠금을 해제해야합니다. 포기할지라도이를 처리 할 필요가 없습니다. 스레드가 정상적으로 종료되도록하는 대신 일반적인 사용자 경험은 사용자가 피로를 느끼거나 작업을 취소 한 다음 다시 시도하십시오. 즉, 이전 비동기 작업에서 사용한 자원을 다시 사용하려면이 자원을 해제해야합니다.
1
비동기 작업을 취소하기 위해서는 해당 취소 토큰을 확인하고 계속 작업을 중단하는 작업이 필요하므로이 작업은 신중한 단계를 수행해야합니다. 나는. 취소 토큰은 단지 async/await 메커니즘이 아닌 구현 된 패턴 일뿐입니다.
비동기 작업이 완료 핸들이있는 단지 하나의 I/O 호출 인 경우 작업은 취소하기보다는 포기할 수 있습니다. 이는 작업이 토큰을 확인할 때까지 oppurtunity를 가질 수 없기 때문입니다. 그 전화가 다시 오면 아무 것도 얻지 못합니다.
취소 토큰을 고려할 때 먼저 취소 작업을 지원함으로써이 작업을보다 효율적으로 수행 할 수 있는지 또는 완료를 기다리지 않고 (즉, 대신 시간 초과 메커니즘 사용) 더 적합한 지 고려하십시오.
관련 문제
- 1. 타이머가 Java에서 완료되기를 기다리는 중
- 2. Qt에서 DBus 서비스를 기다리는 중
- 3. pthread_cancel이 끝날 때까지 기다리는 중
- 4. 플래시 플레이어가 디버거에 연결되기를 기다리는 중
- 5. 스레드가 실행 완료 될 때까지 기다리는 중
- 6. C# 다른 서비스가 시작되기를 기다리는 중
- 7. pthread_join을 사용하지 않고 pthread_create를 기다리는 중
- 8. 스레드를 시작하고 모두 끝내기를 기다리는 중
- 9. 하스켈의 두 입력을 동시에 기다리는 중
- 10. # 자바 스크립트 이벤트가 끝날 때까지 기다리는 중 #
- 11. 자바 스크립트가 진행되기 전에 기다리는 중
- 12. Perl : 백그라운드 프로세스가 완료되기를 기다리는 중
- 13. 자식 창로드가 완료 될 때까지 기다리는 중
- 14. Appdomain 코드가 끝날 때까지 기다리는 중
- 15. TcpClient - 데이터를 사용할 수있게되기를 기다리는 중
- 16. select를 사용하여 클라이언트 소켓에서 데이터를 기다리는 중
- 17. Windows 서비스에서 스레드가 멈추기를 기다리는 중
- 18. 메서드를 호출하고 반환 값을 기다리는 중
- 19. C# : 모든 스레드가 완료되기를 기다리는 중
- 20. 이 메커니즘을 구현하는 방법 :
- 21. Java - 바쁜 대기 메커니즘을 구현
- 22. iPhone SDK에서 CLLocationManagerDelegate의 didUpdateToLocation 메서드를 기다리는 중 UITableView가 채워지지 않습니다.
- 23. UI 스레드를 차단하지 않고 스레드가 완료 될 때까지 기다리는 중
- 24. 메인 스레드를 계속 실행하기 전에 DialogActivity가 반환되기를 기다리는 중
- 25. (iPhone) 완료 방법을 기다리는 방법, 인수 중 하나가 호출하는 선택자입니다.
- 26. 프로세스를 시작하고 Groovy 또는 Java에서 조건을 기다리는 중
- 27. 다른 페이지로 진행하기 전에 DIV가 멈추기를 기다리는 중
- 28. 조건 변수를 기다리는 많은 스레드 중 특정 스레드에게 신호 보내기
- 29. WaitForExit() 런타임 예외. (cmd 프로세스가 끝날 때까지 기다리는 중)
- 30. py-amqp/flopsy : Python에서 단일 AMQP 메시지를 기다리는 중
취소 토큰을 사용하는 취소 메커니즘은 비동기의 C# 5 CTP를 포함하여 방향이 바뀌는 것처럼 보입니다. http://msdn.microsoft.com/en-us/vstudio/gg316360. C# 5를 호출하지는 않지만 여기에서 C#의 "다음"버전을 나타내는 데 사용하고 있습니다. –
질문에 "await"을 사용 했으므로 CTP에 익숙한 것으로 나타났습니다. 필자는 Task Parallel Library (.NET 4)의 종류가 제공하는 기능이 갈 길이라는 것을 확인했으며 Async CTP는 동일한 패러다임을 사용합니다. –
관련 항목 : http://stackoverflow.com/q/4914374/60761 –