2011-01-07 4 views
0

위임자를 사용하여 몇 가지 비동기 함수 호출을 설정하는 C# 응용 프로그램에서 작업하고 있습니다. 이러한 호출은 다중 호출의 대상이되므로 userState 인수를 사용하는 대리자의 BeginInvoke 메서드 오버로드를 사용해야합니다. 예컨대 : Event-based Asynchronous Pattern Overview page on MSDN다중 비동기 호출 수행 REQUIRE unique userStates?

callerDelegate.BeginInvoke([fn_args...], callback, userState) 

, 그것은 userState에 대해 말한다 : 단일 호출 및 다중 호출 :

잠재적으로 두 개의 오버로드 비동기 작업 있다. 은 메서드 서명을 사용하여이 두 형식을 구별 할 수 있습니다. 다중 호출 형식에는 userState라는 추가 매개 변수가 있습니다. 이 양식을 작업이 완료 될 때까지 기다리는 동안 Method1Async (문자열 매개 변수, 개체 userState)를 여러 번 호출하는 코드를 완료 할 수 있습니다. 메서드를 호출하기 전에 Method1Async (string param)를 호출하려고 시도하면 메서드는 InvalidOperationException을 발생시킵니다.

다중 호출 오버로드의 userState 매개 변수를 사용하면 조작을 비동기식 조작으로 구별 할 수 있습니다. 당신은 각 작업이 완료되면, 당신의 이벤트 핸들러의 인스턴스를 확인할 수 있습니다 Method1Async (문자열 PARAM, 객체 userState), 및 각 호출에 대해 고유 한 값 (예를 들어, GUID 또는 해시 코드를) 제공 작업이 완료 이벤트 인 을 발생 시켰습니다.

내 질문은 :는이 userState은 고유해야합니까? 표현은 단지 그것을 권고로 삼거나 그들의 예와 관련이있는 것으로 해석 될 수 있습니다. 나는 콜백에 상태를 전달할 필요가있다. 단지 그것이 유일 할 필요는 없다. (응용 프로그램에서 호출의 개별 인스턴스를 추적 할 필요가 없습니다.) 그래서 고유성이 요구 사항입니까? (아마도 .NET의 비동기 프레임 워크는 그것을 필요로?)

또한, 인용 페이지는 이벤트 기반 비동기 작업입니다; 내 사례 (대리자를 사용하여 비동기 호출)에도 적용됩니까?

나는 며칠 동안 google을 검색했으며 아직 답변을 찾지 못했습니다.

미리 감사드립니다.

답변

3

귀하의 사례에는 해당되지 않습니다. Begin/End은 이벤트 기반 비동기 패턴 (EAP)이 아닌 IAsyncResult 비동기 패턴입니다.

일반적으로 구현시 고유 한 사용자 상태가 필요한 AsyncOperationManager.CreateOperation이 사용되므로 EAP에 영향을줍니다.이 경우에도 최종 사용자 코드가 null 사용자 상태를 전달하는 것이 일반적으로 유효합니다. CreateOperation을 호출하면 EAP 구성 요소가 new object으로 바뀝니다.

+0

많은 감사! (그러한 자세한 질문에 대한 그러한 간결한 응답!) – paul