gpt4 book ai didi

c# - 为什么我的线程完成后要花这么长时间才能退出?

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:39 25 4
gpt4 key购买 nike

我有一个问题(也许这不是问题),我创建了一个线程,它确实可以工作,然后我完成并退出了工作线程(我创建任务的线程)。在我看来,我看到一切都已完成,我创建的新线程应该已经退出。但由于某种原因,线程在函数完成后实际上并没有退出几秒钟(大约 5-8 秒)。我可以通过观察输出窗口中的行来判断...

The thread 'threadTaskWorker16' (0xdd8c) has exited with code 0 (0x0).

这是我创建新线程的方式...

public bool CreateNewTask()
{
Task<TaskInfo> taskWork = Task.Factory
.StartNew(() => threadTaskWorker(taskParams),
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default)
.ContinueWith(task => threadTaskComplete(task.Result));
}

private TaskInfo threadTaskWorker(TaskInfo taskParams)
{
Thread.CurrentThread.Name = "threadTaskWorker" + Thread.CurrentThread.ManagedThreadId;
Debug.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " has started it's long and exhausting process that would have hung the GUI out to dry...");
for (int i = 0; i < 50; i++)
{
Thread.Sleep(3000);
}
Debug.WriteLine("Thread has completed it's work.");
}

private TaskInfo threadTaskComplete(TaskInfo taskParams)
{
Debug.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " has been destroyed.");
}

所以我的问题是,为什么在自定义函数完成后实际退出线程需要这么长时间?我正在考虑以某种方式在我的函数结束时终止线程,但这似乎我会以错误的方式进行。有没有办法让线程更快退出?

第二个问题,是否有一种方法可以触发事件,以便我知道线程何时真正退出(就像我在输出窗口中看到它时一样)?

最佳答案

您正在看到 ThreadPool 的效果。由于创建新线程的计算成本很高,Tasks 将保留一个线程“池”,如果它们未被使用,则将它们重新用于多个任务。只有在 Pool 发现它有多余的未使用线程后,它才会实际杀死线程,并在输出窗口中显示该消息。

您的 threadTaskDestroyed 应该在任务完成后立即被调用,不需要任何类型的事件。如果您真的想要更多控制权,请查看一些同步对象,例如 MutexAutoResetEvent。如果您使用的是 Tasks,则不必担心管理线程,因为在大多数情况下,一切都会为您处理并“做正确的事”。

有关详细信息,请参阅这篇 MSDN 文章 https://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx

顺便说一句,永远不要杀死一个线程。你会让事情处于非常不可预测的状态。 http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation

关于c# - 为什么我的线程完成后要花这么长时间才能退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33347783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com