2012-09-26 50 views
0

我要顯示在標籤的文本爲特定的時間,所以我做了谷歌搜索,我發現這兩個解決方案:顯示文本的具體時間

第一個解決方案是:

public void InfoLabel(string value) 
{ 
    if (InvokeRequired) 
    { 
     this.Invoke(new Action<string>(InfoLabel), new object[] { value }); 
     return; 
    } 
    barStaticItem3.Caption = value; 

    if (!String.IsNullOrEmpty(value)) 
    { 
     System.Timers.Timer timer = 
           new System.Timers.Timer(3000) { Enabled = true }; 
     timer.Elapsed += (sender, args) => 
     { 
      this.InfoLabel(string.Empty); 
      timer.Dispose(); 
     }; 
    } 
} 

第二溶液:

private void ShowTextForParticularTime(String caption) 
{ 
    Timer t = new Timer { Interval = 5000, Enabled = true}; 
    t.Tick += (sender, args) => OnTimerEvent(sender, args, caption); 
} 

private void OnTimerEvent(object sender, EventArgs e, String caption) 
{ 
    barStaticItem3.Caption = caption; 
} 

能否請你告訴我deffrence兩個方案之間,以及爲什麼我們使用這個symbole「=>」,我也明白,從這一行沒有什麼:

if (InvokeRequired) 
{ 
    this.Invoke(new Action<string>(InfoLabel), new object[] { value }); 
    return; 
} 
+0

哪些技術你使用Asp.Net,WinForms或WPF? – codingbiz

+0

我忘記提及我會編輯我的問題 –

回答

2

好的,這裏有一個很好的解釋。

您顯示的兩個選項之間沒有大的差異。他們看起來不同的原因是因爲第一個id在公共方法中聲明委託方法(lambda表達式),而第二個只是創建一個事件處理程序。他們幾乎完成同樣的事情。事實上你可以看到,在委託方法中,你有傳統的事件處理程序參數(對象發件人,EventArgs e)。我個人更喜歡第二種解決方案,因爲它對我來說看起來更清潔。

Invoke Required用於處理線程。在C#中,如果沒有創建可視對象的線程嘗試更改可視對象,則會引發錯誤。爲了解決這個問題,我們通過調用「Invoke」來調用創建視覺對象的線程。 「InvokeRequired」屬性只是告訴我們當前線程是否不創建可視對象。你應該總是用這個當你線程或進行委託方法(因爲你無法控制運行它們的線程。)

我希望這篇簡短的解釋有所幫助。評論如果它不清楚

+0

Okey非常感謝。我仍然有一些含糊不清的理解,但我有了這個想法,我只有一個問題,第二個解決方案顯示了我指定的時間後的字符串,但我想顯示字符串的時間,我指定的時間比它消失,解決方案1適用於我。 –

+0

在另一個答案上回答了這個問題。他們非常相似,我感到困惑:) –

2

在WinForms和WPF的UI只能從創建相關控件的線程更新。這兩種方法顯示了從另一個線程更新UI的兩種方法。

第一種方法是手動檢查代碼是否在另一個線程上運行,如果是,則將調用編組到UI線程。

第二種方法使用一個事件,留下編組到.NET

=>表示lamda expression符號的細節。你可以把它想象得像一個函數指針(儘管有時候它實際上在後臺叫做expression tree)。本質上,它創建一個變量,指向可以通過引用該變量來調用的代碼。

兩種方法都應該正常工作。我個人更喜歡第二種方法,因爲它允許框架處理更多的管道工作。

+0

非常感謝,對我來說,我使用了第一個解決方案,因爲第二個解決方案做了相反的工作,我希望它能在我指定的時間之後顯示字符串,但第一個解決方案顯示字符串我指定的時間。 –

+1

啊,這是一個簡單的修復。滴答功能發生在指定的時間之後。如果您希望標題開始可見,請在打開表單或創建標題時將其設置,並使OnTimer事件將其設置爲String.Empty –