나는 네트워크 응용 프로그램을 작성하고 있습니다.이벤트 기반 비동기 패턴에서 작업 병렬 라이브러리 사용
메시지는 다음과 같은 전송을 통해 전송되는 :
Network.SendMessage (new FirstMessage());
이 메시지 유형, 도착과 같이 때 호출 할 이벤트 핸들러를 등록 할 수 있습니다
:
Network.RegisterMessageHandler<FirstMessage> (OnFirstMessageReceived);
그리고 이벤트가 시작됩니다 :
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
}
내 네트워크 응용 프로그램에 대한 사용자 지정 인증 절차를 쓰고 있습니다. 완료하려면 약 다섯 개의 메시지가 필요합니다. 작업 병렬 라이브러리를 사용하지 않고
, 정말처럼, 앞의 이벤트 처리기에서 각 절차의 다음 단계를 코딩하도록 강요 될 것이다 :
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
Network.SendMessage(new SecondMessage());
}
public void OnSecondMessageReceived(EventArgs<SecondMessageEventArgs> e)
{
Network.SendMessage(new ThirdMessage());
}
public void OnThirdMessageReceived(EventArgs<ThirdMessageEventArgs> e)
{
Network.SendMessage(new FourthMessage());
}
public void OnFourthMessageReceived(EventArgs<FourthMessageEventArgs> e)
{
// Authentication is complete
}
내가 주위에 점프의 아이디어를 좋아하지 않는다 이 부분과 그 일부를 코딩하는 소스 코드. 이해하고 편집하기가 어렵습니다.
작업 병렬 라이브러리가이 솔루션을 상당히 단순화한다고 들었습니다.
그러나 작업 병렬 라이브러리를 사용하여 읽은 많은 예제는 활성 작업 체인과 관련되어있었습니다.
public void Drink() {}
public void Eat() {}
public void Sleep() {}
Task.Factory.StartNew( () => Drink())
.ContinueWith(() => Eat() )
.ContinueWith(() => Sleep());
이 각 이벤트 핸들러 메서드는 호출되는 내 이벤트 기반 비동기 패턴에서 반대 : 나는 '활성'가 무엇을 의미, 명시 적으로 호출 할 때 각 작업과 같이, 시작할 수 있다는 것입니다 메시지가 수신되면 즉
, 나는 이런 식으로 뭔가 할 수 없다 (을하지만 난 원하는) :
Task.Factory.StartNew( () => OnFirstMessageReceived() )
.ContinueWith(() => OnSecondMessageReceived())
.ContinueWith(() => OnThirdMessageReceived() )
.ContinueWith(() => OnFourthMessageReceived());
나는 this article을 읽었습니다,하지만 난 확실히 그것을 이해하지 않습니다. 내가 필요한 것은 TaskCompletionSource
과 관련이있는 것 같습니다. 위의 코드 블록과 같은 이벤트 기반 비동기 패턴에서 작업을 만들고 싶다면 어떻게 생겼을까요?
이것은 좋은 팁이며, 실제로 WebClient와 함께 작업하는 것이 훨씬 쉬워졌습니다. 감사!! –