백그라운드 스레드에서 실행되도록 작업을 트리거하고 싶습니다. 작업 완료를 기다리고 싶지 않습니다.
.net 3.5에서는이 작업을 수행했을 것입니다.
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
.net 4에서는 TPL이 권장되는 방법입니다. 내가 본 일반적인 패턴은 다음과 같습니다.
Task.Factory.StartNew(() => { DoSomething(); });
그러나, StartNew()
방법은 반환 Task
되는 구현 객체 IDisposable
. 이 패턴을 추천하는 사람들은 이것을 간과하는 것 같습니다. Task.Dispose()
방법 에 대한 MSDN 설명서에는 다음과 같은 내용이 있습니다.
"작업에 대한 마지막 참조를 해제하기 전에 항상 Dispose를 호출하십시오."
작업이 완료 될 때까지 작업에 대해 dispose를 호출 할 수 없으므로 주 스레드가 대기하고 dispose를 호출하면 처음에 백그라운드 스레드에서 수행하는 요점이 무너집니다. 또한 정리에 사용할 수있는 완료 / 종료 된 이벤트가없는 것 같습니다.
Task 클래스의 MSDN 페이지는 이에 대해 언급하지 않으며 "Pro C # 2010 ..."책은 동일한 패턴을 권장하며 작업 처리에 대해서는 언급하지 않습니다.
내가 그냥두면 파이널 라이저가 결국 그것을 잡을 것이라는 것을 알고 있지만, 내가 많은 불을 지르고 이와 같은 작업을 잊어 버리고 파이널 라이저 스레드가 압도 당할 때 이것이 돌아와서 나를 물게 될까요?
그래서 내 질문은 다음과 같습니다.
- 그것은 호출하지 받아 들일
Dispose()
온Task
이 경우 클래스? 그렇다면 왜 그리고 위험 / 결과가 있습니까? - 이에 대해 설명하는 문서가 있습니까?
- 아니면
Task
내가 놓친 물건을 처분하는 적절한 방법이 있습니까? - 아니면 TPL로 작업을 수행하고 잊어 버리는 다른 방법이 있습니까?