【问题标题】:Aborting a stuck method after a timeout超时后中止卡住的方法
【发布时间】:2017-09-27 10:34:29
【问题描述】:

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

因此,我们的 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.
    }

【问题讨论】:

  • ThreadAbortException?请提供minimal reproducible example
  • 阅读更多关于CancellationTokenSource的信息。
  • 您是否声称 CancellationTokenSource 能够在该方法卡在 1 行时停止该方法
  • DLL 分配的东西难吗?当 DLL 分配 FileHandles 或类似的东西时,我不建议使用 Thread.Abort 和 ThreadAbortException。
  • 我不知道未来不同公司的 DLL 会做什么,所以也许

标签: c# multithreading reflection abort


【解决方案1】:

正如评论中所建议的,如果在 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 不会在它执行的那一刻被释放 - 并且可能有更多的竞争条件需要处理。

【讨论】:

  • 它带来了一些困难,因为该方法需要返回一个字符串,并接受多个对象和变量作为参数,但我解决了这个问题。该解决方案有效,如果线程处于中间状态,中止线程可能会导致问题,但至少我现在可以告诉用户这不是我的程序,而是坏的 DLL,这是一个目标。谢谢
  • 更新:如果该方法正在使用 COM 端口之类的资源,并且您中止线程,则会导致“安全句柄已关闭”错误和程序崩溃。但是我也设法通过在不同的应用程序域中执行线程来解决这个问题。 stackoverflow.com/questions/46562227/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 2021-06-07
  • 2018-09-16
  • 1970-01-01
  • 2018-08-18
  • 2014-04-29
相关资源
最近更新 更多