在启动当前线程上下文的线程上调用方法

本文关键字:线程 调用 方法 上下文 前线 启动 | 更新日期: 2023-09-27 18:35:16

我有一个使用称为 Start/Stop 的方法启动/终止线程的类。Stop 方法可以正确清理线程资源,但如果线程本身自然终止或出现异常,我需要能够调用 Stop 或其他变体(如果需要)来正确清理。

由于我设置的锁定机制,从线程方法中调用 Stop 不是一个选项。

有没有办法在其原始上下文中调用 Stop 方法?

private bool Terminate { get; set; }
private object _SyncRoot = new object();
private System.Threading.Thread Thread { get; set; }
private System.Threading.CancellationTokenSource CancellationTokenSource { get; set; }
public bool Start (ProcessorOptions options)
{
    bool result = false;
    lock (this._SyncRoot)
    {
        if (this.State == EnumState.Ready)
        {
            this.Options = options;
            if (this.CancellationTokenSource != null)
            {
                this.CancellationTokenSource.Dispose();
            }
            this.CancellationTokenSource = new System.Threading.CancellationTokenSource();
            //this.CancellationTokenSource.Token.Register(?, null, true);
            this.Terminate = false;
            this.Thread = new System.Threading.Thread(new System.Threading.ThreadStart(this.Process));
            this.Thread.Start();
            result = true;
        }
    }
    return (result);
}
public void Stop ()
{
    lock (this._SyncRoot)
    {
        if (this.State == EnumState.Processing)
        {
            try
            {
                this.Terminate = true;
                this.CancellationTokenSource.Cancel(false);
                if (!this.Thread.Join(System.TimeSpan.FromSeconds(1.0D)))
                {
                    this.Thread.Abort();
                }
            }
            finally
            {
                this.Thread = null;
            }
        }
    }
}
private void Process ()
{
    lock (this._SyncRoot)
    {
        if (this.State != EnumState.Ready)
        {
            throw (new System.InvalidOperationException("The processor instance is not in a ready state."));
        }
    }
    while (!this.Terminate)
    {
        lock (this._SyncRoot)
        {
            if (this.QueuedDocuments.Count == 0)
            {
                if (this.StopAutomaticallyOnQueueEmpty)
                {
                    // Invoke this.Stop() before breaking.
                    break;
                }
            }
        }
        // Parallel.For uses CancellationTokenSource here.
        System.Threading.Thread.Sleep(System.TimeSpan.FromSeconds(0.2D));
    }
}

在启动当前线程上下文的线程上调用方法

如果您不想像 Mike 建议的那样在单独的"维护"线程中跟踪 ThreadStates,您可以尝试以下操作:

将 break 语句保留在 Process 方法中以退出 while 循环(并锁定上下文)。在方法末尾添加以下代码:

ThreadPool.QueueUserWorkItem(o => Stop());

这使用线程池在线程池具有可用线程(通常立即)后立即调用实例中的 Stop 方法。

编辑:您还可以向 Stop 方法添加一个参数,该参数表示您只想清理资源,而不执行任何线程同步(因为线程无论如何都会退出)。或者更好的是,将现有方法一分为二:清理和停止。这允许您在 Process 方法结束时调用 Stop (清理),而无需使用线程池。

在主类中设置一个计时器,用于检查它所管理的每个线程的ThreadState。 如果状态为 ThreadState.Stopped ,请继续清理它(并将其从要监视的线程集合中删除)。