2012-10-15 25 views
2

雖然做了一些取證考古調查在老的應用程序我要保持我碰到這個傳來:爲什麼用空的Delegate調用ThreadStart?

這是一個WPF應用程序,這是最近轉換爲.NET 4.0和該代碼後臺工作

  if(bgWorker1.IsBusy || bgWorker2.IsBusy) 
      { 
       Thread.Sleep(100); 
       Application.Current.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Background, 
        new System.Threading.ThreadStart(delegate { }) 
       ); 
      } 
內運行

1 - 通過使用無操作委託來調用線程(主GUI)會獲得什麼樣的副作用。另外兩個線程也對主要的gui線程執行調用,但只有這個線程纔會將優先級設置爲除Normal以外的其他任務(但它們使用Action而不是TreadStart)。

2 - 我的案例與這個應用程序有着奇怪的相似之處,並告訴我這可能是原因。 (圍繞優先級和主要的gui線程,無外觀原因)。

感謝

+0

對我來說看起來毫無意義...... – japreiss

+0

直到mainthread處理消息時才調用可能的塊。 – CodesInChaos

回答

3

該線程將導致調用函數來阻止,直到Dispatcher的線程可以「過程」的(無操作)的委託。

這可能不是一個好的做法,應該可能會被刪除。我想嫌疑人這裏的目標是讓這個(第三)BackgroundWorker的完成事件成爲前兩個BackgroundWorker完成時的信號。

一般而言,像這樣完成旋轉通常是設計不好的標誌。更好的設計是使用CountdownEvent,這可以在完成時由BackgroundWorker實例發出信號。

然後您可以等倒計時事件,而不是循環與Thread.Sleep和調度程序調用。

+0

因此,如果我理解正確,它基本上在調度程序的堆棧中設置排序書籤並暫停該線程,直到達到並處理書籤。我想這接近於Side Effect Oriented Programming的樣子:-)。 – Newtopian

+0

@Newtopian是的 - 種。它會阻塞,直到Dispatcher運行委託(它什麼都不做),所以是的,這真的是編程的副作用。 –

2
  1. "What possible side-effect would be acheived by [...]"因爲它使用Invoke,而不是BeginInvoke這將是一個阻塞調用。這意味着你的後臺線程不會繼續執行,直到你的noop委託運行。結果是,代碼將不會繼續,直到在執行此noop之前排入消息循環的所有內容爲止。
  2. "I have cases that strangely resembles deadlock with this application and something tells me that this could be the cause."聽起來對我來說似乎合理。這段代碼尖叫了不好的做法,並可能導致死鎖的位置。由於代碼引用其他後臺工作者,可能是其他人正在做類似的事情。

現在,它似乎很清楚,東西是錯的,但不知道更多關於這是怎麼回事這是相當困難關於如何可以固定發表評論。我的猜測是,儘管正在採取的方法有一個基本的設計缺陷。

+0

謝謝,我並不是在尋找一種解決方案,而是那些代碼真的讓我誤解了它的目的。謝謝。幫助很多。 – Newtopian

相關問題