나는 ManualResetEvent를 사용하여 스레드를 동기화하는 응용 프로그램을 사용하고 있습니다. FxCop이 그 물건들을 처분하라고 나에게 말했다. 나는 나에게 같은 말 다음의 논의 발견ManualResetEvent는 언제 폐기되어야합니까?
Do I need to Dispose() or Close() an EventWaitHandle?
을 그러나으로 ManualResetEvent의 인스턴스를 처리 할 때 나도 몰라.
private void btn_Click(object sender, EventArgs e)
{
var mre = new ManualResetEvent(false);
new Thread(() => this.SetEvent(mre)).Start();
for (int i = 0; i < 10; ++i)
{
new Thread(() => this.WaitFor(mre)).Start();
}
}
private void SetEvent(ManualResetEvent manualResetEvent)
{
Thread.Sleep(10000);
manualResetEvent.Set();
}
private void WaitFor(ManualResetEvent manualResetEvent)
{
manualResetEvent.WaitOne();
}
문제는으로 ManualResetEvent의 여러 인스턴스가 존재하고 여러 스레드가 각 인스턴스을 기다리고 있다는 것입니다 :
다음의 간단한 코드는 문제를 보여줍니다.
내가 인스턴스를 목록에 외우면 나는 언제 폐기할지 모른다. WaitOne() 호출 후에 처리하면 호출이 여러 번 처리되고 다른 스레드가 여전히 대기하는 동안 처 리됩니다.
이벤트를 생성 한 스레드에는 이벤트에 대한 참조가 없습니다. 이 MRE를 기다리는 다른 스레드가 있기 때문에 setter-thread는이를 처리해서는 안됩니다. 대기중인 각 스레드는 앞서 언급 한 것처럼 처리 할 수 없습니다.
그래서 질문입니다.이 ManualResetEvent를 언제 폐기해야합니까?
코드는 무의미하며 MRE의 인스턴스가 하나만 * 있습니다. 메서드의 끝에 그것을 처리하는 것은 괜찮습니다. –
아니, 그렇게 생각하지 않아.MRE를 생성하는 코드는 버튼 클릭 이벤트 핸들러입니다. 여러 MRE를 생성하는 여러 번 클릭 할 수 있습니다. 위의 코드는 단순화되었습니다. 메서드가 완료된 후에이 MRE를 사용하는 스레드가 11 개 있기 때문에이 메서드 끝에서 MRE를 삭제하면 작동하지 않습니다. setter-thread는 10 초를 대기하고 다른 10 개의 스레드가이 MRE를 기다리고 있습니다. –