2012-11-15 27 views
0

是否允許/不鼓勵在Windows窗體應用程序中使用標籤來顯示應用程序狀態?使用Label來登錄WindowsForm應用程序有時會導致異常 - 爲什麼?

起初我認爲這應該是一個明智的想法,但現在我意識到我有很多不會顯示的日誌,並且如果我不在Label.Text變化周圍放置try/catch,通常會崩潰。 這是我使用的功能。

private void Echo(string p) 
{ 
    lock (m_syncObject) 
    { 
     try 
     { 
      InfoBox.Text = p.ToString(); 
     } 
     catch { } 
    } 
} 

正如您所看到的,我還添加了一個鎖來對同一資源進行多次訪問。 任何人都可以解釋爲什麼我經常在'catch'中結束?

+1

你真的不應該吞下這樣的例外。沒有看到它們是什麼,你期望怎樣才能學會如何規避它們? =) –

+0

請找出拋出的異常是什麼,並用這個來澄清你的問題。目前,任何給出的答案都將基於對代碼內部工作的其他內容的猜測。 =) –

+0

你的應用程序是多線程的嗎? 'string p'可能爲null。 – Coder

回答

3

InfoBox.Text = p.ToString(); - >這可能會生成一個跨線程異常。試試這個:

delegate void myDelegate(ref Label lb, string toAdd); 
private void UpdateLabel(ref Label lb, string toAdd) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new myDelegate(UpdateLabel), new object[] { lb, toAdd }); 
    } 
    else 
    { 
     lb.Text = toAdd; 
    } 
} 
1

您不必針對字符串類型變量調用.ToString。如果你的p爲空,那麼你將會得到例外。你可以簡單地做:

private void Echo(string p) 
{ 
    lock (m_syncObject) 
    { 
        try 
        { 
            InfoBox.Text = p; 
        } 
        catch { } 
    } 
} 
+1

相反,它也可能是一個跨線程的例外......我看到有人打敗了我。 =) –

相關問題