이벤트에 가입 한 스레드 풀 스레드가 있고 다른 스레드에서 이벤트 처리기가 실행됩니다. 내 질문은 - 언제 스레드 풀 스레드가 다시 풀로 돌아가거나 이벤트 구독이 활성화되어있는 한 주변에 머무를 것입니까? 예를 들어스레드 풀 스레드 및 이벤트 수신 대기
:
public class RunTasks
{
private readonly MyTask _myTask;
public RunTasks(MyTask myTask)
{
_myTask = myTask;
}
public void Execute()
{
ThreadPool.QueueUserWorkItem((ignore) => _myTask.Execute());
}
}
public class MyTask
{
private readonly IThridPartyApi _dependency;
public MyTask(IThridPartyApi dependency)
{
_dependency = dependency;
}
public void Execute()
{
_dependency.UpdateEvent -= Handler;
_dependency.UpdateEvent += Handler;
}
private void Handler(object sender, EventArgs e)
{
//raised on another thread as it's coming from a thrid party library.
}
}
public interface IThridPartyApi
{
event EventHandler<EventArgs> UpdateEvent;
}
위의 예에서 우리는 (100의 범위)를 여러 번 호출되는 이벤트 핸들러가 그 중 50 해고 도착하고 다음 지연되었다 RunTasks.Execute 방법 가정 해 봅시다 50 - 얼마나 많은 활성 스레드가 이벤트 구독을 수신 대기합니까? 내 응용 프로그램 에서이 시나리오를 가지고, 그래서이 구현의 괴물을 만들 아니야 확인하려고합니다. 대답과 이유를 알려주십시오. 또한 이것이 효율적인 구현이 아닌 경우 어떻게 수정합니까 (async를 사용하지 않고도 아직 수정할 수 없음)? Execute 메서드는 UI 단추 처리기에서 시작됩니다.
감사합니다, - 마이크
왜 TPL 대신 자신의 작업을 구현하고 있습니까? 그것은 훨씬 간단한 방법으로 그러한 문제를 해결합니다. 게다가 이벤트 핸들러가 비동기 적으로 실행되기를 원한다면 (예를 들어'async'를 사용하여), 여전히 TPL Tasks를 사용할 필요가 있습니다. –
비동기는 아직 사용하지 않으므로 사용하지 마십시오. 그러나 TPL을 사용할 수는 있지만 어떻게 해결할 수 있습니까? – Mike
코드가 지금과 같은 방식으로 ThreadPool 스레드가 처리기를 설정하고 해제됩니다. 핸들러는 thir-party 스레드에 의해 실행됩니다. 그게 니가 원하는거야? –