我有一堆阻塞呼叫的功能,在网络连接丢失或其他问题的情况下可能会挂起。我想制作一个通用包装器,允许使用指定的 timout 和参数运行传递的函数。
一个函数原型:
public static double Func1(string ip, string username, string password);
public static int Func2(string ip, string username, string password, string dir);
我的包装:
public static T? ExecuteAsync<T>(Func<object[], T> func, int timeout /* sec */, params object[] args) where T : struct
{
var task = Task.Factory.StartNew(() => func(args));
if (task.Wait(timeout * 1000))
return task.Result;
return null;
}
预期用途:
var res1 = ExecuteAsync<double>(Func1, 30, "1.1.1.1", "user", "looser");
var res2 = ExecuteAsync<int>(Func2, 20, "1.1.1.1", "user", "looser", "home");
这里的编译器错误(与调用一致ExecuteAsync):
错误 CS1503 参数 1:无法从“方法组”转换为“功能”
我找到了一个可编译的代码
var res = ExecuteAsync((args) => Func1(args[0].ToString(), args[1].ToString(), args[2].ToString()), 50, "ip", "user", "pass");
它太重且难以阅读。可以简化吗?如何修复原始错误?也许还有另一种方法可以达到目标?
我看到了带有 的示例Action,但是我的函数正在返回一个值,并且它们具有不同的参数列表。
狐的传说
相关分类