Как заставить этот метод расширения компилироваться? - PullRequest
4 голосов
/ 15 мая 2009

Я пытаюсь создать метод расширения для универсального делегата 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);
    }
}

Проблема в том, что он не будет компилироваться из-за дополнительных <T>, которые делают AsyncActionCallback универсальным и имеют сигнатуру, отличную от ожидаемой. Ожидается подпись void AsyncActionCallback(IAsyncResult).

Кто-нибудь знает, как обойти это или выполнить то, что я пытаюсь сделать?

Ответы [ 3 ]

7 голосов
/ 15 мая 2009
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 голосов
/ 15 мая 2009

Если вы хотите, чтобы ваша функция была разделена (не как лямбда), что-то вроде этого:

public static void AsyncInvoke<T>(Action<T> action, T param)
{
    action.BeginInvoke(param, new AsyncCallback(AsyncActionCallback<T>), action);
}
0 голосов
/ 15 мая 2009

AsyncActionCallback<T>?

Отказ от ответственности: не уверен в вышеизложенном, может быть одним из этих «ограничений».

...