在C#中,有没有可能解决函数调用超时问题?

4
在我的程序中,我调用了一个方法。
xslTransform.Load(strXmlQueryTransformPath, xslSettings, new XmlUrlResolver());


我面临的问题是:有时这个函数不能在规定时间内很好地执行。

有时编译器经过长时间的尝试后会引发超时问题...这将导致应用程序的这一部分关闭。我想避免这种情况的发生。

因此,如果超过了某个时间,比如10秒,我需要重新调用该方法。是否可能在此附近添加一些代码行,以满足要求?

1个回答

4

您需要在新的Thread上调用该方法,然后使用10秒的超时调用新线程上的Join方法。

例如:

public static bool RunWithTimeout(ThreadStart method, TimeSpan timeout, int maxTries) {
    while(maxTries > 0) {
        var thread = new Thread(method);
        thread.Start();
        if (thread.Join(timeout))
            return true;
        maxTries--;
    }
    return false;
}


if (!RunWithTimeout(
    delegate { xslTransform.Load(strXmlQueryTransformPath, xslSettings, new XmlUrlResolver()); },
    TimeSpan.FromSeconds(10),
    5  //tries
))
    //Error! Waaah!

1
如果发生超时,此代码将创建多个线程,所有这些线程都将继续工作直到完成。如果线程.Join超时,则后台线程仍在运行。 - Paul Williams
@Paul:是的,它会。你可以通过调用“Abort”来解决这个问题,但中止是不好的。 - SLaks
@SLaks,我尝试使用这段代码...抱歉...但是它报错了..!! - Rookie Programmer Aravind
然后,我将语句修改为 "if(!RunWithTimeout(xslTransform.Load(strXmlQueryTransformPath, xslSettings, new XmlUrlResolver()), TimeSpan.FromSeconds(10), 5)) ;",现在它报错说 "无法将 void 转换为 System.Threading.ThreadStart"。如何解决这个错误? - Rookie Programmer Aravind
1
你正在运行C# 2.0。请尝试我的编辑代码。(我之前使用了C# 3的lambda表达式) - SLaks
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接