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 關注
- 158 瀏覽
添加回答
舉報