2009-05-15 8 views
4

J'essaye de créer une méthode d'extension pour le délégué générique Action<T> pour être capable de faire des appels asynchrones simples sur les méthodes Action<T>. Il met en œuvre essentiellement tout le modèle lorsque vous souhaitez exécuter la méthode et ne se soucient pas de c'est le progrès:Comment faire pour compiler cette méthode d'extension?

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); 
    } 
} 

Le problème est qu'il ne compilera pas à cause de la <T> supplémentaire qui rend le AsyncActionCallback générique et avoir une signature différente de celle attendue. La signature void AsyncActionCallback(IAsyncResult) est attendue.

Est-ce que quelqu'un sait comment contourner cela ou accomplir ce que j'essaie de faire?

Répondre

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

C'est un moyen :) Bonne réflexion. – leppie

+0

Génial, merci beaucoup pour cette réponse rapide! C'est intéressant de voir comment lambdas permet quelque chose qui n'était pas possible auparavant. Je suppose que ce n'est pas seulement du sucre après tout! –

+0

Notez que cette approche peut laisser tomber toutes les erreurs qui se produisent lors de l'invocation sur le sol. Vous pourriez vouloir envelopper le contenu du lambda dans un try {} catch {}. –

0

AsyncActionCallback<T>?

Avertissement: pas sûr de ce qui précède, pourrait être l'une de ces «limitations».

+0

Je ne sais pas ce que vous voulez dire. J'utilise exactement la même signature dans le code que j'ai posté. Mais encore une fois cela ne compilerait pas parce que le compilateur n'attend pas le paramètre de type . De toute façon, la solution de Darin utilisant un lamda au lieu du délégué fonctionne. –

0

Si vous voulez garder votre fonction séparée (pas lambda) ce que quelque chose comme ceci:

public static void AsyncInvoke<T>(Action<T> action, T param) 
{ 
    action.BeginInvoke(param, new AsyncCallback(AsyncActionCallback<T>), action); 
} 
Questions connexes