C# 线程睡眠是否影响线程池?
我需要为自己的目的控制一个线程:计算、等待、报告等。C# 线程睡眠是否影响线程池?,c#,multithreading,windows-phone-7,windows-phone-8,threadpool,C#,Multithreading,Windows Phone 7,Windows Phone 8,Threadpool,我需要为自己的目的控制一个线程:计算、等待、报告等。 在所有其他情况下,我都使用线程池或TaskEx 在调试器中,当我执行Thread.Sleep()时,我注意到UI的某些部分变得不那么负责。不过,没有调试器似乎可以正常工作 问题是:如果我正在创建新线程并Sleep()”使用它,它会影响线程池/任务吗 编辑:以下是代码示例: 我的应用程序中的一个随机位置: ThreadPool.QueueUserWorkItem((state) => { LoadImageSource(image
在所有其他情况下,我都使用
线程池
或TaskEx
在调试器中,当我执行Thread.Sleep()
时,我注意到UI的某些部分变得不那么负责。不过,没有调试器似乎可以正常工作
问题是:如果我正在创建新线程并Sleep()
”使用它,它会影响线程池/任务吗
编辑:以下是代码示例:
我的应用程序中的一个随机位置:
ThreadPool.QueueUserWorkItem((state) =>
{
LoadImageSource(imageUri, imageSourceRef);
});
我的应用程序中的另一个随机位置:
var parsedResult = await TaskEx.Run(() => JsonConvert.DeserializeObject<PocoProductItem>(resultString, Constants.JsonSerializerSettings));
如果其中一个任务报告了一些网络问题,我希望这个线程等待一段时间
if (ProcessRequest(requestToProcess, true))
{
RequestQueue.Dequeue();
}
else
{
DoWhenTaskReturnedFalse();
Thread.Sleep(3000);
}
所以,再问一次这个问题:canThread.Sleep(3000)代码>,从新线程(ProcessQueue)调用代码>,影响线程池或TaskEx.Run()?否,线程.Sleep()仅在当前线程上:
线程挂起的毫秒数
如果在线程池线程中调用Thread.Sleep(),并尝试排队更多,则Thread.Sleep()会影响调用它的线程。它可能会达到线程池线程的最大计数,并等待一个线程完成后再执行另一个线程
假设您睡眠的线程是从线程池获得的,那么它肯定会影响线程池。如果显式地说线程应该休眠,那么在此期间线程池不能重用它。如果有一些作业等待调度,这可能会导致线程池产生新线程。创建一个新线程总是很昂贵的——线程是系统资源
不过,您可以查看方法(以及async
和await
),该方法以更智能的方式暂停执行代码—允许在等待期间重用线程。
请参阅本文。如果您能展示一个简短但完整的程序来演示这个问题,那将非常有帮助。在线程池线程上调用Thread.Sleep()是非常不明智的,它只是通往线程池调度程序的道路上的一块石头,它无法理解tp线程为什么没有完成,因此不知道释放另一个tp线程。其他方面与UI响应性没有直接关系,等待的任务可能会停滞不前。您总是使用Task.Delay()来代替它。@JonSkeet添加了一些示例,希望它们可以help@HansPassant我从新创建的new Thread()
调用它。它会影响线程池吗?如果您在调试器中看到异常行为,那是因为您正在调试,大多数情况下是这样。你不应该太担心它。担心运行时的性能。很抱歉,问题不清楚,我添加了一些详细信息。我正在new Thread()
上调用Thread.Sleep(),它能降低线程池的速度吗?我添加了一些细节。我在锁的内部调用Thread.Sleep()
,所以我不能在那里使用waits。因此,如果我调用Thread.Sleep(),线程池不会受到影响。Sleep()来自new Thread()
?@vitalivasylenko我对线程池不是很敏感,但我假设不是。这里一样:)谢谢你的回答,我只是想确定一下。
if (ProcessRequest(requestToProcess, true))
{
RequestQueue.Dequeue();
}
else
{
DoWhenTaskReturnedFalse();
Thread.Sleep(3000);
}