gpt4 book ai didi

c# - 如何在 C# 中编写超时方法

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:33 26 4
gpt4 key购买 nike

我有一些方法需要更长的时间来执行并且涉及大量的数据库操作。我想将这些方法包装在可超时方法中,以便如果它没有在恒定时间内回调,我将回滚。

有什么办法可以做到这一点,我也必须在主线程中运行该方法,因为我正在使用的第 3 方 com 对象无法在后台线程中执行。

我们将不胜感激任何类型的建议。

问候,

比贝克达瓦迪

最佳答案

我想出了一个与链接到的解决方案类似的解决方案,只是我使用了 Thread.Interrupt() 而不是 Thread.Abort(),我认为这对主线程会更友好一些。问题是 Thread.Interrupt() 不会中断被阻塞的调用,所以在很多情况下它并不令人满意。 Thread.Abort() 是一个危险的调用,应尽可能避免。选择你的毒药。

对于它的值(value),这是我的实现:

public static class AbortableProc
{

public static void Execute(Action action, Action timeoutAction, int milli)
{
Thread currThread = Thread.CurrentThread;
object stoppedLock = new object();
bool stopped = false;
bool interrupted = false;

Thread timer = new Thread(() =>
{
Thread.Sleep(milli);
lock (stoppedLock)
{
if (!stopped)
{
currThread.Interrupt();
stopped = true;
interrupted = true;
}
}
});
timer.Start();

try
{
action();
lock (stoppedLock)
{
stopped = true;
}
}
catch (ThreadInterruptedException)
{
}
if (interrupted)
{
timeoutAction();
}
}
}

对于 grins,我设置了一个 timeoutAction 以便您可以在这种模式下使用它:

AbortableProc.Execute(
() => { Process(kStarting); Process(kWorking); Process(kCleaningUp); },
() => { if (IsWorking()) CleanUp(); }
};

关于c# - 如何在 C# 中编写超时方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4926786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com