调用一个方法并取消它,如果花费时间太长 return 到调用方法
Call a method and cancel it and return to the calling method if it takes too long
在 c# 中有没有一种方法可以调用一个方法,以便如果该方法需要很长时间才能完成,该方法将被取消并 return 到调用方法?我想我可以用线程来做到这一点,但如果不需要线程怎么办?
作为参考,我可能需要kill/stop/abort的方法是调用CorelDraw 15 API。这将打开 CorelDraw 的一个实例,并且我在该方法中收到了不可重复的错误。意思是,我可以处理同一张图像两次,一次它会冻结或出错,而另一次则不会。
我正在使用的问题的当前解决方案是让第二个应用程序执行 Process.Start(firstAppExecutablePath)
然后检查文本文件中的变量,如果变量在 10 分钟后没有改变,.Kill();
在进程实例上被调用。如果可能的话,我宁愿避免这种解决方案,因为它看起来很笨重并且容易出现问题。由于它运行 .Kill();
,所以它的关闭方式非常混乱,但通常不会引起问题。
线程是绝对需要的,除非您可以从函数内部检查超时 - 但您可能不需要。所以这里有一个极简的线程方法:
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;
}
不是内置的,不,因为无法安全地中断任意代码(如果它正在调用刚刚获取全局锁并需要的 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;
}
在 c# 中有没有一种方法可以调用一个方法,以便如果该方法需要很长时间才能完成,该方法将被取消并 return 到调用方法?我想我可以用线程来做到这一点,但如果不需要线程怎么办?
作为参考,我可能需要kill/stop/abort的方法是调用CorelDraw 15 API。这将打开 CorelDraw 的一个实例,并且我在该方法中收到了不可重复的错误。意思是,我可以处理同一张图像两次,一次它会冻结或出错,而另一次则不会。
我正在使用的问题的当前解决方案是让第二个应用程序执行 Process.Start(firstAppExecutablePath)
然后检查文本文件中的变量,如果变量在 10 分钟后没有改变,.Kill();
在进程实例上被调用。如果可能的话,我宁愿避免这种解决方案,因为它看起来很笨重并且容易出现问题。由于它运行 .Kill();
,所以它的关闭方式非常混乱,但通常不会引起问题。
线程是绝对需要的,除非您可以从函数内部检查超时 - 但您可能不需要。所以这里有一个极简的线程方法:
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;
}
不是内置的,不,因为无法安全地中断任意代码(如果它正在调用刚刚获取全局锁并需要的 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;
}