2012-01-16 244 views
4

當使用螺紋,「調用」被用來避免「跨線程」(1)哪些功能更有效?

但是,有時「定時器對象」是被用來避免「CrossThread」(2)

這樣(例如)

public partial class Form1 : Form 
{ 

    private bool bCheckState = false; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    //Button Click 
    private void btnWork_Click(object sender, EventArgs e) 
    { 
     Thread m_Thread = new Thread(new ThreadStart(Work)); 
     m_Thread.Start(); 

    } 

    private void Work() 
    { 
     bCheckState = true;    
     // not use invoke 
    } 


    private void timer_Tick(object sender, EventArgs e) 
    { 
     if (bCheckState) 
     { 
      //tbxDisplay is winform's textBox control - printing data 
      tbxDisplay.Text = bCheckState.ToString(); 
      bCheckState = false; 
     } 
    } 
} 

哪一個更有效? 「之間(1)和(2)」


難道是一個問題,如果我們在「定時器事件」檢查之後散射「線程」中處理的數據,而無需使用「調用」或其他方法? (我們聽說在打印'線程'內處理的數據時爲了避免'跨線程',使用額外的'定時器對象'將數據分散到'定時器事件'中經常被使用,因爲它既沒有益處也沒有害處)。

+0

不確定你的意思。你根本沒有在你的代碼中使用invoke,你需要它'timer_Tick'和'Work()' – gideon 2012-01-16 07:16:22

+0

'effective'是什麼意思? – 2012-01-16 07:17:30

+0

也看看使用SynchronizationContext而不是在這裏調用Invoke http://lostechies.com/gabrielschenker/2009/01/23/synchronizing-calls-to-the-ui-in-a-multi-threaded-application/ – sos00 2012-01-16 07:40:20

回答

1

正如Ben Voigt所建議的那樣,BackgroundWorker可能是您應該在這裏使用的,除非您有充分的理由要使用別的東西。

「有效」是比較模糊的手段。在你正在考慮的兩個選項中,你不完全清楚你正在尋找什麼。

BackgroundWorker s簡單易懂,並且避免使用定時器。

Invoke比定時器更有效,因爲在bCheckState成爲true和正在更新的文本之間會有較少的延遲。由於您不會按照設定的時間間隔進行定時器輪詢,因此它的CPU佔用率也會更低。

Timer更有效,因爲在調用更新文本時線程不必停止,但效率有點低,因爲它會浪費CPU時間檢查布爾值是否已更改,以及在表單更改之前,還可能會延遲達到定時器間隔長度。

作爲另一種替代方案,BeginInvoke可用於更新表單而無需使用定時器,也無需線程必須等待調用完成。但是,如果引發異常,則線程可能無法找到,除非您還調用EndInvoke,這也將停止執行線程,直到調用完成。

他們都有自己的優點和缺點,你不能真正地調用任何特定的一個更「有效」的一般。

5

只需使用BackgroundWorker實例並處理已在正確線程中的ReportProgress和/或RunWorkerCompleted事件。

+0

謝謝你的建議 – KDJ 2012-01-20 00:20:05