如何在C#中制作通用的超时函数包装器?

时间:2019-03-12 14:51:09

标签: c# asynchronous timeout

我有一堆阻止呼叫的功能,如果网络连接中断或其他问题,这些呼叫可能会挂起。我想制作一个通用包装器,以允许使用指定的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的示例,但是我的函数正在返回一个值,并且它们具有不同的参数列表。

0 个答案:

没有答案