【问题标题】:Does Thread.Sleep affect the ThreadPool?Thread.Sleep 会影响线程池吗?
【发布时间】:2016-04-08 23:00:31
【问题描述】:

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

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

问题是:如果我正在创建新线程并Sleep()'ing 它,它会影响 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);
}

那么,再问一个问题:从new Thread(ProcessQueue); 调用的Thread.Sleep(3000); 会影响ThreadPool 或TaskEx.Run() 吗?

【问题讨论】:

  • 如果你能展示一个简短但完整的程序来说明问题,这将真的有所帮助。
  • 在线程池线程上调用 Thread.Sleep() 是非常不明智的,它只是通往线程池调度程序的一块石头,它看不到为什么 tp 线程没有完成所以不知道释放另一个 tp 线程。与 UI 响应没有直接关系,等待的任务可能会陷入困境。你总是使用 Task.Delay() 代替。
  • @JonSkeet 添加了一些示例,希望对您有所帮助
  • @HansPassant 我从新创建的new Thread() 调用它。它会影响线程池吗?
  • 如果您在调试器中看到奇怪的行为,那是因为您经常在调试。你不应该太担心它。担心运行时的性能。

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


【解决方案1】:

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

但是,您可以查看Task.Delay 方法(以及asyncawait),它以更智能的方式暂停执行代码 - 允许在等待期间重用线程。 参考这篇Thread.Sleep vs. Task.Delay 文章。

【讨论】:

  • 我添加了一些细节。我在锁内调用Thread.Sleep(),所以我不能在那里使用等待。
【解决方案2】:

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

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

【讨论】:

  • 对不起,不清楚的问题,我添加了一些细节。我在new Thread() 上调用 Thread.Sleep(),它会减慢 ThreadPool 的速度吗?
【解决方案3】:

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

线程暂停的毫秒数。

【讨论】:

  • 所以,如果我从new Thread() 调用 Thread.Sleep(),ThreadPool 不会受到影响?
  • @VitaliiVasylenko 我对 ThreadPools 不太敏感,但我认为不会。
  • 这里也一样 :) 感谢您的回答,我只是想确定一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多