我有一堆阻止呼叫的功能,如果网络连接中断或其他问题,这些呼叫可能会挂起。我想制作一个通用包装器,以允许使用指定的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
的示例,但是我的函数正在返回一个值,并且它们具有不同的参数列表。