c# 泛型委托的异步调用
c# asynchronous invoke of generic delegates
我想使用 async await
调用通用 Delegate
。我没有使用预建的委托,而是一般的 Delegate
class 可以接收作为对象数组的参数。
我正在做这样的事情:
public object InvokeAction(Delegate action, object[] actionArgs = null)
{
if(action == null)
{
return null;
}
return action.DynamicInvoke(args);
}
我想做的是使用 await
给 运行 委托一个选项,但是由于 DynamicInvoke
returns 一个对象,它没有 awaiter
.
有没有办法定义一个通用委托并进行异步调用?如果不是通用的,是否有一些接近通用委托的版本(可以强制用户使用某些委托定义)可以按我想要的方式调用?
您的代表需要 return 一个 awaitable type,通常是 Task
或 Task<TResult>
。
您可以在运行时进行检查:
public async Task<TResult> InvokeAction<TResult>(Delegate action, object[] actionArgs = null)
{
//...
var result = action.DynamicInvoke(actionArgs);
if (result is Task<TResult> task) return await task;
return (TResult)result;
}
但是,只要 actionArgs
没有在您的方法中被修改,您就可以静态键入您的委托,并使用闭包:
public async Task<TResult> InvokeAction<TResult>(Func<Task<TResult>> action)
{
//...
return await action();
}
var result = InvokeAction(() => YourMethodAsync(arg1, arg2));
我假设 IF 目标委托引用异步方法(returns Task
或 Task<T>
)然后您想异步执行它。然后你可以使用类似于你当前的方法,但是它是异步的:
public static async Task<object> InvokeActionAsync(Delegate action, object[] actionArgs = null)
{
if (action == null) {
return null;
}
// invoke it
var result = action.DynamicInvoke(actionArgs);
if (result == null)
return null;
if (result.GetType().IsGenericType && result.GetType().GetGenericTypeDefinition() == typeof(Task<>)) {
// this is some Task<T> which returns result
await (Task) result;
// now need to grab the result
return result.GetType().GetProperty("Result").GetValue(result);
}
else if (result is Task) {
// it's regular Task which does not return the value
await (Task) result;
return null;
}
// otherwise nothing to really run async, just return result
return result;
}
我想使用 async await
调用通用 Delegate
。我没有使用预建的委托,而是一般的 Delegate
class 可以接收作为对象数组的参数。
我正在做这样的事情:
public object InvokeAction(Delegate action, object[] actionArgs = null)
{
if(action == null)
{
return null;
}
return action.DynamicInvoke(args);
}
我想做的是使用 await
给 运行 委托一个选项,但是由于 DynamicInvoke
returns 一个对象,它没有 awaiter
.
有没有办法定义一个通用委托并进行异步调用?如果不是通用的,是否有一些接近通用委托的版本(可以强制用户使用某些委托定义)可以按我想要的方式调用?
您的代表需要 return 一个 awaitable type,通常是 Task
或 Task<TResult>
。
您可以在运行时进行检查:
public async Task<TResult> InvokeAction<TResult>(Delegate action, object[] actionArgs = null)
{
//...
var result = action.DynamicInvoke(actionArgs);
if (result is Task<TResult> task) return await task;
return (TResult)result;
}
但是,只要 actionArgs
没有在您的方法中被修改,您就可以静态键入您的委托,并使用闭包:
public async Task<TResult> InvokeAction<TResult>(Func<Task<TResult>> action)
{
//...
return await action();
}
var result = InvokeAction(() => YourMethodAsync(arg1, arg2));
我假设 IF 目标委托引用异步方法(returns Task
或 Task<T>
)然后您想异步执行它。然后你可以使用类似于你当前的方法,但是它是异步的:
public static async Task<object> InvokeActionAsync(Delegate action, object[] actionArgs = null)
{
if (action == null) {
return null;
}
// invoke it
var result = action.DynamicInvoke(actionArgs);
if (result == null)
return null;
if (result.GetType().IsGenericType && result.GetType().GetGenericTypeDefinition() == typeof(Task<>)) {
// this is some Task<T> which returns result
await (Task) result;
// now need to grab the result
return result.GetType().GetProperty("Result").GetValue(result);
}
else if (result is Task) {
// it's regular Task which does not return the value
await (Task) result;
return null;
}
// otherwise nothing to really run async, just return result
return result;
}