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

C# 如何在C中编写超时方法#,c#,methods,timeout,C#,Methods,Timeout,我有一些方法需要更长的时间来执行,并且涉及大量的数据库操作。我想将这些方法包装在timeoutable方法中,这样,如果它没有在固定时间内回调,我将回滚 有没有办法做到这一点,我也必须在主线程中运行该方法,因为我使用的第三方com对象不能在后台线程中执行 如有任何建议,我们将不胜感激 问候, Bibek Dawadi我一直支持你,直到你说你需要它在主线程中运行。我认为这不可能像你描述的那样 问题是,你需要至少两个线程来执行计时和实际工作,而这两个线程都不能是主线程,因为计时器不会使用主线程,而且

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

有没有办法做到这一点,我也必须在主线程中运行该方法,因为我使用的第三方com对象不能在后台线程中执行

如有任何建议,我们将不胜感激

问候,


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,这对我来说是可行的,我没有其他选择,我在主/从分布式系统上工作,主系统将分配一些作业给从系统,如果从系统无法完成作业,则在一段预测的时间间隔后,主系统将假定从系统上发生了一些错误,并采取任何必要的措施来增加这些错误。我不知道如果不是通过超时方法,编程世界中是否有任何选项可用。