【发布时间】: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