线程.Sleep会影响ThreadPool

本文关键字:ThreadPool 影响 Sleep 线程 | 更新日期: 2023-09-27 18:03:15

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

在调试器中,当我做Thread.Sleep()时,我注意到UI的某些部分变得不那么负责。不过,没有调试器似乎工作得很好。

问题是:如果我正在创建新的线程和Sleep() 'ing它,它会影响线程池/任务吗?

编辑:这里是代码示例:

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

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

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

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

我的ConcurrentQueue(经过修改,原文取自此处):

为Queue需求创建线程:

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()吗?

线程.Sleep会影响ThreadPool

假设您设置为睡眠状态的线程是从线程池中获得的,那么它肯定会影响线程池。如果显式地说线程应该休眠,那么在此期间线程池不能重用它。如果有一些作业等待调度,这可能会导致线程池生成新的线程。创建一个新线程总是很昂贵的——线程是系统资源。

你可以查看Task。Delay方法(以及asyncawait),它以一种更智能的方式暂停执行代码——允许线程在等待期间被重用。参考这个线程。睡眠vs.任务。延迟。

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

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

不,thread. sleep()只在当前线程上。thread . sleep (int32)文档:

线程挂起的毫秒数。