超时后中止卡住的方法

Aborting a stuck method after a timeout

我们的程序正在执行来自 DLL 的未知方法。有时这些方法不会处理超时并且永远不会 return 一个值。

因此,我们的Methodinfo.invoke(...)将永远卡在这条线上。

有什么好的方法可以中止我们的方法吗? 我知道我应该 运行 这种异步方法没问题。

根据要求,这里有一些可视化的小例子:

 public string startTheDLLMethod(int timeout)
    {
        var methodinfo = "...";

        return methodGettingStuck(methodinfo); //todo, abort this after timeout
    }

    public string methodGettingStuck(methodinfo)
    {
        var1 = "";
        var2 = "";

        methodinfo.Invoke(var1, var2); //Stuck.
    }

如评论中所建议,如果在 dll 中分配了诸如文件句柄之类的东西,我将尽量不使用 ThreadAbortException

但是给你:

    public void BlockingCallWithTimeout()
    {
        Semaphore waitHandle = new Semaphore(0,1);
        Thread thread = new Thread(this.Wrapper);
        Timer timer = new Timer(state =>
        {
            thread.Abort();
            waitHandle.Release();
        },null,5000,0);

        thread.Start(waitHandle);

        waitHandle.WaitOne(); //wait until completion or until timeout
        timer.Dispose();
    }

    public void Wrapper(object state)
    {
        Semaphore semaphore = (Semaphore)state;

        //Call DLL Method

        semaphore.Release();
    }

您需要在代码中的某处处理 ThreadAbortException(未尝试)。这段代码只是一个例子!您需要注意同时发生超时和成功的情况。所以 Timer 在它执行的那一刻并没有被释放 - 并且可能有更多的竞争条件需要处理。