我需要为自己的目的控制一个线程:计算,等待,报告等...
在所有其他情况下,我使用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()?
答案 0 :(得分:3)
Thread.Sleep()会影响它调用的线程,如果您在ThreadPool线程中调用Thread.Sleep()并尝试排队更多它可能会达到ThreadPool的最大计数线程并在执行另一个线程之前等待线程完成。
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads.aspx
答案 1 :(得分:3)
假设您放入睡眠的线程是从线程池中获取的,那么它肯定会影响线程池。如果你明确地说线程应该休眠,那么在此期间线程池不能重用它。如果有一些等待调度的作业,这可能会导致线程池产生新线程。创建新线程总是很昂贵 - 线程是系统资源。
然而,您可以查看以更智能的方式暂停执行代码的Task.Delay方法(以及async
和await
) - 允许在等待期间重用该线程。
请参阅此Thread.Sleep vs. Task.Delay文章。
答案 2 :(得分:1)
不,Thread.Sleep()仅在当前线程上。 Thread.Sleep(int32) documentation:
线程被挂起的毫秒数。