繁体   English   中英

调用方法并取消它,如果花费的时间太长,则返回调用方法

[英]Call a method and cancel it and return to the calling method if it takes too long

在c#中是否有一种方法可以调用方法,这样如果方法需要很长时间才能完成,方法将被取消并返回调用方法? 我想我可以通过线程来做到这一点但是如果不需要线程怎么办?

作为参考,我可能需要kill / stop / abort的方法是调用CorelDraw 15 API。 这将打开CorelDraw的一个实例,我在此方法中收到了不可重复的错误。 意思是,我可以处理相同的图像两次,一次会冻结或错误,另一次则不会。

我正在使用的问题的当前解决方案是让第二个应用程序执行Process.Start(firstAppExecutablePath) ,然后检查文本文件中的变量,如果变量在10分钟后没有更改, .Kill(); 在进程的实例上调用。 如果可能的话,我宁愿避免使用这种解决方案,因为它似乎很笨拙且容易出问题。 因为它运行.Kill(); 事情如何关闭却非常混乱,但一般不会引起问题。

不是内置的,不是,因为无法安全地中断任意代码(如果它正在调用C库函数(不支持异常),它刚刚采取全局锁定并需要释放它?) 。

但是你可以自己写这样的支持。 除非绝对必要,否则我不会在混合中添加线程,因为它们带来了潜在问题的全新维度。

例:

void Caller()
{
    int result;
    if (TryDoSomething(out result, 100)) {
        System.Console.WriteLine("Result: {0}", result);
    }
}

bool TryDoSomething(out int result, int timeoutMillis)
{
    var sw = Stopwatch.StartNew();
    result = 0x12345678;
    for (int i = 0; i != 100000000; ++i) {
        if (sw.ElapsedMilliseconds > timeoutMillis)
            return false;
        result += i / (result % 43) + (i % 19);
    }
    return true;
}

绝对需要线程,除非您可以检查函数内的超时 - 这可能是您没有的。 所以这是一个带线程的简约方法:

private static bool ExecuteWithTimeout(TimeSpan timeout, Action action)
{
    Thread x = new Thread(() => { action(); });
    x.Start();

    if (!x.Join(timeout))
    {
        x.Abort(); //Or Interrupt instead, if you use e.g. Thread.Sleep in your method
        return false;
    }

    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM