c# - 从另一个托管线程获取当前行

标签 c# multithreading

我正在使用此代码为另一个线程提供时间限制,并在一定时间后将其中断:

    void RunWithTimeout(Action action, TimeSpan timeout)
    {
        AutoResetEvent signal = new AutoResetEvent(false);
        Thread workerThread = null;
        ThreadPool.QueueUserWorkItem((o) =>
        {
            workerThread = Thread.CurrentThread;
            action();
            signal.Set();
        });

        using (new Timer((o) => { signal.Set(); }, null, (int)timeout.TotalMilliseconds, Timeout.Infinite))
        {
            signal.WaitOne();
        }

        if (workerThread != null && workerThread.IsAlive)
        {
            try
            {
                workerThread.Abort();
            }
            catch { }
            throw new System.TimeoutException();
        }
    }

我使用的是.NET 3.5,因此无法使用“任务”
我现在抛出TimeoutException,但是我想知道调用Abort时正在执行的行。

有没有办法获取另一个线程的调用堆栈并将其传递给异常的StackTrace属性?

最佳答案

您不需要Timer来等待另一个线程,可以使用WaitOne重载来接受超时(以毫秒为单位)。

要捕获工作线程上的堆栈跟踪,可以通过闭合变量将ThreadAbortException传递给主线程:

private static void RunWithTimeout(Action action, TimeSpan timeout)
{
    Thread worker = null;
    var signal = new AutoResetEvent(false);
    ThreadAbortException abortException = null;
    ThreadPool.QueueUserWorkItem(o =>
    {
        worker = Thread.CurrentThread;
        try
        {
            action();
            signal.Set();
        }
        catch (ThreadAbortException ex)
        {
            //thread is being aborted, pass the exception back to the main thread
            abortException = ex;
        }
    });

    if (!signal.WaitOne(timeout))
    {
        worker.Abort();
        //abortException is now filled from the worker thread, the stack trace for the 
        //worker thread is now inside the InnerException of the ThreadAbortException
        throw new TimeoutException("Operation timed out", abortException);
    }
}

关于c# - 从另一个托管线程获取当前行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26672421/

相关文章:

c# - Visual Studio 测试资源管理器无法在已编译的测试项目中运行测试

multithreading - 从父线程终止工作线程 - MFC

java - 停止已经运行的线程

c# - 从日期范围中删除周末

c# - 是否有一种已知的快速算法来查找与给定数字相乘的所有数字对?

c# - MVC4 + jQuery 淡出通知 div

c# - 如何在 C# 中正确多线程运行时调用的 DLL

具有多个客户端的 Java Socket 编程

java 6线程中断

c# - 在 Linq 中,.Select() 的反义词是什么?