线程.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()吗?
假设您设置为睡眠状态的线程是从线程池中获得的,那么它肯定会影响线程池。如果显式地说线程应该休眠,那么在此期间线程池不能重用它。如果有一些作业等待调度,这可能会导致线程池生成新的线程。创建一个新线程总是很昂贵的——线程是系统资源。
你可以查看Task。Delay方法(以及async
和await
),它以一种更智能的方式暂停执行代码——允许线程在等待期间被重用。参考这个线程。睡眠vs.任务。延迟。
thread . sleep()会影响调用它的线程,如果你在ThreadPool线程中调用thread . sleep()并试图排队,它可能会达到ThreadPool线程的最大计数,并等待一个线程在执行另一个线程之前完成。
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads.aspx不,thread. sleep()只在当前线程上。thread . sleep (int32)文档:
线程挂起的毫秒数。