1 回答
TA贡献1804条经验 获得超3个赞
Func1您遇到的问题是具有三个字符串参数的签名,而您的ExecuteAsync方法的第一个参数需要一个以对象数组作为参数的“方法”,即object[]!=string, string, string
public static double Func1(string ip, string username, string password);
Func<object[], T>
您可以拥有的最简单的解决方案是标准化所有“阻塞函数”的签名。在这种情况下,您的情况将如下面的代码所示。你失去了类型安全。Thread班级使用这种方法
static void Main(string[] args) {
var res1 = ExecuteAsync<double>(Func1, 30, "1.1.1.1", "user", "looser");
}
public static double Func1(object[] args) {
string ip = (string)args[0], username = (string)args[1], password = (string)args[2];
// do some work
return 0.0;
}
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;
}
如果您不想失去类型安全性,您可以创建ExecuteAsync方法的多个重载 - 类似于 .NET 框架为 .NET 创建多个重载的方式Func。在这种情况下,您的ExecuteAsync方法将如下所示。您可以为 1、2、4、5 arg 方法创建其他重载,就像Func实现方式一样
public static TRes? ExecuteAsync<T1, T2, T3, TRes>(Func<T1, T2, T3, TRes> func, int timeout /* sec */, T1 arg1, T2 arg2, T3 arg3) where TRes : struct {
var task = Task.Factory.StartNew(() => func(arg1, arg2, arg3));
if (task.Wait(timeout * 1000))
return task.Result;
return null;
}
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报