亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 C# 中制作一個通用的可超時函數包裝器?

如何在 C# 中制作一個通用的可超時函數包裝器?

C#
楊__羊羊 2022-10-23 10:06:10
我有一堆阻塞呼叫的功能,在網絡連接丟失或其他問題的情況下可能會掛起。我想制作一個通用包裝器,允許使用指定的 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,但是我的函數正在返回一個值,并且它們具有不同的參數列表。
查看完整描述

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;

}


查看完整回答
反對 回復 2022-10-23
  • 1 回答
  • 0 關注
  • 158 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號