如何找出特定线程何时退出 (C#)

本文关键字:退出 何时 线程 何找出 | 更新日期: 2023-09-27 18:33:59

>我这里有个问题。有没有办法以编程方式找出某个线程退出的时刻?我的意思是,即使是VS调试器也会在其输出窗口中为您提供该信息。我知道我只是可以让我的线程引发事件,但是当您生成多个线程时,这当然会导致问题,因此每个线程都会引发该事件,除非您使用一些 toggle 变量来确保只有第一个线程在代码中到达该点会引发事件。

下面是在多个线程中执行的方法的开头,此处显示了取消、暂停和退出逻辑。代码的问题点是对事件处理程序(下载完成、下载暂停和下载取消(的调用。如您所见,其中一些将仅由到达该点的第一个线程执行一次,然后切换相关的布尔变量,因此其他线程不会再次引发此事件。这里的另一个大问题是线程退出逻辑,当线程找不到要下载的项目并返回下载完成事件时,该事件当然将由每个线程触发。这两种方法都是不正确的,我目前不知道如何实现我预期的行为。我所需要的只是知道如何找到一种方法来捕捉所有生成的线程中的最后一个,这样我就可以只引发一次上述所有事件。

请注意,我对 System.Threading.Tasks 命名空间中的类型没有访问权限,因为我的项目针对的是 .net 2.0。这是我第一次尝试编程比某些课堂作业更复杂的东西,所以我意识到这段代码很可能是各种可怕的。

对不起我的英语。

    private void PerformDownload()
    {
        while (true)
        {
            if (askedToCancel)
            {
                lock (lockObj)
                {
                    if (!cancellationPerformed)
                    {
                        cancellationPerformed = true;
                        foreach (DownloadItem di in itemsToProcess)
                            if (di.Status == DownloadItemStatus.Prepared)
                                itemsToProcess.UpdateItemStatus(di.URL, DownloadItemStatus.Canceled);
                        DownloadCanceled();
                    }
                }
                return;
            }
            if (askedToPause)
            {
                lock (lockObj)
                {
                    if (!pausingPerformed)
                    {
                        foreach (DownloadItem di in itemsToProcess)
                            if (di.Status == DownloadItemStatus.Prepared)
                                itemsToProcess.UpdateItemStatus(di.URL, DownloadItemStatus.Paused);
                        DownloadPaused();
                    }
                }
                waitHandle.WaitOne();
            }
            DownloadItem currentItem = null;
            lock (lockObj)
            {
                foreach (DownloadItem di in itemsToProcess)
                    if (di.Status == DownloadItemStatus.Prepared)
                    {
                        currentItem = di;
                        itemsToProcess.UpdateItemStatus(currentItem.URL, DownloadItemStatus.Downloading);
                        break;
                    }
            }
            if (currentItem == null)
            {
                DownloadComplete();
                return;
            }

如何找出特定线程何时退出 (C#)

您可以在计数器上使用 Interlocked.Increment()Interlocked.Decrement(),在线程的入口点递增,在线程退出时递减。然后,如果计数器不为零,则至少有一个线程实例正在运行。

例如:

private int _threadCounter;
private void ThreadEntryPoint()
{
    try
    {
        Interlocked.Increment(ref _threadCounter);
        // Do thread stuff here
    }
    finally
    {
        Interlocked.Decrement(ref _threadCounter);
    }
}

也就是说,恕我直言,对于线程是否正在运行来说,它不太可能是最好的设计。也就是说,每当我想到如何使用这些信息时,在我看来,有一种更好的方法来解决这个问题。

线程的存在是有原因的,而不仅仅是存在。因此,您的代码真正应该关心的是该原因是否已得到解决,而不是是否有任何线程正在运行。如果没有完整的代码示例,我就无法真正评论特定场景。但我怀疑跟踪实际线程的存在不太有用,并且比更面向目标的方法更难维护。