Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程睡眠是否影响线程池?_C#_Multithreading_Windows Phone 7_Windows Phone 8_Threadpool - Fatal编程技术网

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);
}
所以,再问一次这个问题:can
Thread.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);
}