3

我需要控制一個線程爲我自己的目的:計算,等待,報告等...
在所有其他情況下,我使用ThreadPool或TaskEx。Thread.Sleep會影響ThreadPool嗎?

在調試器中,當我在做Thread.Sleep()時,我注意到UI的某些部分變得不那麼負責。雖然,沒有調試器似乎工作正常。

現在的問題是:如果我正在創建新的線程和Sleep()'它可以影響ThreadPool /任務?

編輯:這裏是代碼示例:

在我的應用程序的一個隨機地點:

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

+2

如果你能展示一個簡短但完整的程序來展示這個問題,它將*真的*有用。 –

+0

調用線程。睡眠()在線程池線程是非常不明智的,它只是一個岩石在通往線程池調度程序的道路上,看不到爲什麼一個線程沒有完成,所以不知道釋放另一個線程。沒有其他直接關係到用戶界面的響應能力,可能的任務也許會陷入困境。你總是使用Task.Delay()來代替。 –

+0

@JonSkeet添加了一些示例,希望他們能幫到 –

回答

1

不,Thread.Sleep()只在當前線程上。 Thread.Sleep(int32) documentation

線程掛起的毫秒數。

+0

因此,如果我從'new Thread()'調用Thread.Sleep(),ThreadPool不會受到影響? –

+0

@VitaliiVasylenko我對ThreadPools不太敏銳,但我不認爲。 –

+0

同樣在這裏:)謝謝你的答案,我只是想知道肯定。 –

3

Thread.Sleep()影響它調用的線程,如果您在ThreadPool線程中調用Thread.Sleep()並嘗試排隊更多,它可能會達到ThreadPool線程的最大數量並等待一個線程在執行另一個線程之前完成。

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

+0

對不清楚的問題,我添加了一些細節。我在'new Thread()'上調用Thread.Sleep(),是否可以減慢ThreadPool? –

1

假設睡眠你把線程從線程池獲得的,那麼這無疑會影響線程池。如果你明確地說線程應該睡眠,那麼在這段時間內它不能被線程池重用。這可能會導致線程池產生新的線程,如果有一些工作正在等待安排。創建新線程總是很昂貴 - 線程是系統資源。

然而,您可以查看Task.Delay方法(以及asyncawait),以更智能的方式掛起執行代碼 - 允許在等待過程中重新使用線程。 請參閱此Thread.Sleep vs. Task.Delay文章。

+0

我已經添加了一些細節。我在鎖內調用'Thread.Sleep()',所以我不能在那裏等待。 –