我正在尝试为通用委托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)
是预期的。
有谁知道如何解决这个问题或者想要实现我想做的事情?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
AsyncActionCallback<T>
?
免责声明:不确定上述内容,可能是其中一个“限制”。
答案 2 :(得分:0)
如果你想让你的功能分开(而不是像lambda)那么这样的东西:
public static void AsyncInvoke<T>(Action<T> action, T param)
{
action.BeginInvoke(param, new AsyncCallback(AsyncActionCallback<T>), action);
}