우리는 비동기로 일부 작업을 수행하고 작업이 완료되면 이벤트를 발생시키는 방법을 사용하는 일반적인 시나리오가 있습니다.비동기 메서드를 동기화하는 일반적인 방법이 있습니까?
ManualResetEvent reset = new ManualResetEvent(false);
someobject.AsyncActionDone += (sender, args) => reset.Set();
someobject.PerformAsyncAction();
reset.WaitOne();
이 작업을 수행하는 도우미 메서드를 작성하는 방법이 있나요 :
우리가 기적 대신 우리는이 비슷한 모양의 코드가 그렇게 할 시간이있다? 나는 수행 할 Action을 전달할 수 있지만, 헬퍼 메소드가 EventHandler를 매개 변수로 전달할 수있는 것처럼 보이지 않기 때문에 어떤 이벤트를 듣는지 알 수있는 무언가를 전달하는 방법을 모르겠습니다.
이 바람직 반사 필요로하지 않는 솔루션 약간의 혼동이 될 것 같다이 무엇 SomeObject의의 클래스의 샘플 것은 같은 것입니다 : 내가 당신의 표류를 잡을 경우
public class SomeClass
{
private ExternalServer someServerOverTheNetwork = new ExternalServer();
public event EventHandler AsyncActionDone;
public Data SomeData { get; set; }
public void PerformAsyncAction()
{
someServerOverTheNetwork.GetSomeData(OnDataRetrived);
}
public Data OnDataRetrived(Data someData)
{
AsyncActionDone(this, new DataEventArgs(someData));
}
}
someobject의 구현 자입니까, 아니면 수정할 수없는 라이브러리 유형입니까? –
그러나 우리는 그러한 대상이 많이 있습니다. 대부분의 작업에는 서버에 요청을 보내고 결과가 돌아 오기를 기다리는 것이 포함되므로 기본적으로 비동기가됩니다. – Davy8
우리는 가장 일반적인 작업 중 하나 인 서버에서 객체 목록을 캐싱하는 방법을 사용하지만 정확한 객체 유형과 수신 대기하는 이벤트에 따라 다릅니다. 어떤 이벤트를 듣고 전달할 수 있기를 바란다. 그래서 중복되는 코드를 줄일 수있다. 유일한 차이점은 메서드와 완료시 발생하는 이벤트이기 때문이다. – Davy8