1 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
Func1您遇到的問(wèn)題是具有三個(gè)字符串參數(shù)的簽名,而您的ExecuteAsync方法的第一個(gè)參數(shù)需要一個(gè)以對(duì)象數(shù)組作為參數(shù)的“方法”,即object[]!=string, string, string
public static double Func1(string ip, string username, string password);
Func<object[], T>
您可以擁有的最簡(jiǎn)單的解決方案是標(biāo)準(zhǔn)化所有“阻塞函數(shù)”的簽名。在這種情況下,您的情況將如下面的代碼所示。你失去了類(lèi)型安全。Thread班級(jí)使用這種方法
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;
}
如果您不想失去類(lèi)型安全性,您可以創(chuàng)建ExecuteAsync方法的多個(gè)重載 - 類(lèi)似于 .NET 框架為 .NET 創(chuàng)建多個(gè)重載的方式Func。在這種情況下,您的ExecuteAsync方法將如下所示。您可以為 1、2、4、5 arg 方法創(chuàng)建其他重載,就像Func實(shí)現(xiàn)方式一樣
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 關(guān)注
- 169 瀏覽
添加回答
舉報(bào)