Thread.Sleep会影响ThreadPool吗?

时间:2014-05-14 14:35:00

标签: c# multithreading windows-phone-7 windows-phone-8 threadpool

我需要为自己的目的控制一个线程:计算,等待,报告等...
在所有其他情况下,我使用ThreadPool或TaskEx。

在调试器中,当我正在进行Thread.Sleep()时,我注意到UI的某些部分变得不那么负责任了。虽然,没有调试器似乎工作正常。

问题是:如果我正在创建新的线程并Sleep(),它会影响ThreadPool / Tasks吗?

编辑:这是代码示例:

我的应用中的一个随机位置:

ThreadPool.QueueUserWorkItem((state) =>
{
    LoadImageSource(imageUri, imageSourceRef);
});

我的应用中的另一个随机位置:

var parsedResult = await TaskEx.Run(() => JsonConvert.DeserializeObject<PocoProductItem>(resultString, Constants.JsonSerializerSettings));

我的ConcurrentQueue(已修改,原始版本取自here):

为队列需要创建线程:

public void Process(T request, bool Async = true, bool isRecurssive = false)
{
    if (processThread == null || !processThread.IsAlive)
    {
        processThread = new Thread(ProcessQueue);
        processThread.Name = "Process thread @ " + Environment.TickCount;
        processThread.Start();
    }

如果其中一个任务报告了一些网络问题,我希望这个线程稍等一下

if (ProcessRequest(requestToProcess, true))
{
    RequestQueue.Dequeue();
}
else
{
    DoWhenTaskReturnedFalse();
    Thread.Sleep(3000);
}

那么,问题还有一次:从Thread.Sleep(3000);调用的new Thread(ProcessQueue);是否会影响ThreadPool或TaskEx.Run()?

3 个答案:

答案 0 :(得分:3)

Thread.Sleep()会影响它调用的线程,如果您在ThreadPool线程中调用Thread.Sleep()并尝试排队更多它可能会达到ThreadPool的最大计数线程并在执行另一个线程之前等待线程完成。

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads.aspx

答案 1 :(得分:3)

假设您放入睡眠的线程是从线程池中获取的,那么它肯定会影响线程池。如果你明确地说线程应该休眠,那么在此期间线程池不能重用它。如果有一些等待调度的作业,这可能会导致线程池产生新线程。创建新线程总是很昂贵 - 线程是系统资源。

然而,您可以查看以更智能的方式暂停执行代码的Task.Delay方法(以及asyncawait) - 允许在等待期间重用该线程。 请参阅此Thread.Sleep vs. Task.Delay文章。

答案 2 :(得分:1)

不,Thread.Sleep()仅在当前线程上。 Thread.Sleep(int32) documentation

  

线程被挂起的毫秒数。