2009-05-15 4 views
4

Action<T> 메서드에서 간단한 비동기 호출을 수행 할 수 있도록 일반 대리자 Action<T>에 대한 확장 메서드를 만들려고합니다. 그것은 기본적으로 당신이 방법을 실행하고자 할 때의 패턴을 구현하고 진행의 걱정하지 않는다 :이 확장 메서드를 컴파일하는 방법은 무엇입니까?

public static class ActionExtensions 
{ 
    public static void AsyncInvoke<T>(this Action<T> action, T param) { 
     action.BeginInvoke(param, AsyncActionCallback, action); 
    } 

    private static void AsyncActionCallback<T>(IAsyncResult asyncResult) { 
     Action<T> action = (Action<T>)asyncResult.AsyncState; 
     action.EndInvoke(asyncResult); 
    } 
} 

문제는이 때문에 AsyncActionCallback 일반적이고하게 추가 <T>의 컴파일되지 것입니다 예상과 다른 서명이 있어야합니다. 서명 void AsyncActionCallback(IAsyncResult)이 필요합니다.

누구든지이 문제를 해결하거나 내가하려고하는 일을 수행하는 방법을 알고 있습니까?

답변

7
public static void AsyncInvoke<T>(this Action<T> action, T param) 
{ 
    action.BeginInvoke(param, asyncResult => 
    { 
     Action<T> a = (Action<T>)asyncResult.AsyncState; 
     a.EndInvoke(asyncResult); 
    }, action); 
} 
+0

그건 한 가지 방법입니다. 좋은 생각입니다. – leppie

+0

굉장하고, 그 놀라운 빠른 대답에 대해 너무 감사드립니다! 람다가 이전에 불가능했던 것을 가능하게하는 방법은 흥미 롭습니다. 결국 설탕이 아닐까요? –

+0

이 방법을 사용하면 호출 중에 발생한 오류가 바닥에 떨어질 수 있습니다. try {} catch {} 안에 람다의 내용을 래핑하려고 할 수 있습니다. –

0

AsyncActionCallback<T>?

면책 조항 : 위에 명시된 내용이 '제한 사항'중 하나 일 수 있습니다. 당신이 당신의 기능을 분리 유지하려면

+0

난 당신이 무슨 뜻인지 모르겠습니다. 내가 게시 한 코드에 똑같은 서명을 사용하고 있습니다. 그러나 컴파일러가 형식 매개 변수 을 기대하지 않기 때문에 다시 컴파일되지 않습니다. 어쨌든 대리인 대신 람다 (lamda)를 사용하는 Darin의 솔루션이 효과가 있습니다. –

0

은 (하지 람다와 같은) 어떤이 같은 약 :

public static void AsyncInvoke<T>(Action<T> action, T param) 
{ 
    action.BeginInvoke(param, new AsyncCallback(AsyncActionCallback<T>), action); 
} 
관련 문제