C# 如何在C中编写超时方法#
我有一些方法需要更长的时间来执行,并且涉及大量的数据库操作。我想将这些方法包装在timeoutable方法中,这样,如果它没有在固定时间内回调,我将回滚 有没有办法做到这一点,我也必须在主线程中运行该方法,因为我使用的第三方com对象不能在后台线程中执行 如有任何建议,我们将不胜感激 问候,C# 如何在C中编写超时方法#,c#,methods,timeout,C#,Methods,Timeout,我有一些方法需要更长的时间来执行,并且涉及大量的数据库操作。我想将这些方法包装在timeoutable方法中,这样,如果它没有在固定时间内回调,我将回滚 有没有办法做到这一点,我也必须在主线程中运行该方法,因为我使用的第三方com对象不能在后台线程中执行 如有任何建议,我们将不胜感激 问候, Bibek Dawadi我一直支持你,直到你说你需要它在主线程中运行。我认为这不可能像你描述的那样 问题是,你需要至少两个线程来执行计时和实际工作,而这两个线程都不能是主线程,因为计时器不会使用主线程,而且
Bibek Dawadi我一直支持你,直到你说你需要它在主线程中运行。我认为这不可能像你描述的那样 问题是,你需要至少两个线程来执行计时和实际工作,而这两个线程都不能是主线程,因为计时器不会使用主线程,而且你希望操作终止,如果是主线程,则会关闭整个应用程序。通常的做法是设置一个从主线程运行的包装器类,并为操作和计时器设置后台线程
确切地说,为什么必须从主线程调用第三方库?我找到了一个与链接到的解决方案类似的解决方案,只是我使用了thread.Interrupt()而不是thread.Abort(),我认为这样对主线程会更友好一些。问题是Thread.Interrupt()不会中断被阻止的调用,因此在许多情况下都不能令人满意。Thread.Abort()是一个危险的调用,应该尽可能避免。选择你的毒药 值得一提的是,这是我的实现:
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();
}
}
}
对于露齿而笑,我设置了一个超时动作,以便您可以在此模式下使用它:
AbortableProc.Execute(
() => { Process(kStarting); Process(kWorking); Process(kCleaningUp); },
() => { if (IsWorking()) CleanUp(); }
};
除非有人有更好的想法,否则我认为应该有一个方法属性。否则,可以使用定时器或其他设计建议。在主线程中执行繁重的操作是可能的,但如果可以的话,应该避免。但是,除非主线程不断地检查自己,否则确实需要另一个线程。我使用的是OutookAPI,以及一些从后台线程调用时它如何不一致地工作的问题。微软技术支持部门建议只从主线程调用API,这对我来说是可行的,我没有其他选择,我在主/从分布式系统上工作,主系统将分配一些作业给从系统,如果从系统无法完成作业,则在一段预测的时间间隔后,主系统将假定从系统上发生了一些错误,并采取任何必要的措施来增加这些错误。我不知道如果不是通过超时方法,编程世界中是否有任何选项可用。