第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在 C# 中制作一個(gè)通用的可超時(shí)函數(shù)包裝器?

如何在 C# 中制作一個(gè)通用的可超時(shí)函數(shù)包裝器?

C#
楊__羊羊 2022-10-23 10:06:10
我有一堆阻塞呼叫的功能,在網(wǎng)絡(luò)連接丟失或其他問(wèn)題的情況下可能會(huì)掛起。我想制作一個(gè)通用包裝器,允許使用指定的 timout 和參數(shù)運(yùn)行傳遞的函數(shù)。一個(gè)函數(shù)原型: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;    }預(yù)期用途: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");這里的編譯器錯(cuò)誤(與調(diào)用一致ExecuteAsync):錯(cuò)誤 CS1503 參數(shù) 1:無(wú)法從“方法組”轉(zhuǎn)換為“功能”我找到了一個(gè)可編譯的代碼var res = ExecuteAsync((args) => Func1(args[0].ToString(), args[1].ToString(), args[2].ToString()), 50, "ip", "user", "pass");它太重且難以閱讀。可以簡(jiǎn)化嗎?如何修復(fù)原始錯(cuò)誤?也許還有另一種方法可以達(dá)到目標(biāo)?我看到了帶有 的示例Action,但是我的函數(shù)正在返回一個(gè)值,并且它們具有不同的參數(shù)列表。
查看完整描述

1 回答

?
狐的傳說(shuō)

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;

}


查看完整回答
反對(duì) 回復(fù) 2022-10-23
  • 1 回答
  • 0 關(guān)注
  • 169 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)