簡體   English   中英

使用定時器和 2 個按鈕的跨線程操作無效

[英]Cross-thread operation not valid using timer and 2 buttons

我遇到了這個問題...

對此有什么好的解決方案?

 private void button1_Click(object sender, EventArgs e)
    {
        aTimer.Enabled = true;
        button1.Enabled = false;

    }

    private void button2_Click(object sender, EventArgs e)
    {
        aTimer.Enabled = false;
    }

    private void timer_is_working(object source, ElapsedEventArgs e)
    {
        aTimer.Enabled = false;
        button1.Enabled = true;
    }

謝謝! 親切的問候丹尼爾·魯舍爾

所以你沒有說清楚,但基於ElapsedEventArgs類型, timer_is_working似乎是System.Timers.Timer實例的Elapsed事件。

請注意,.NET Framework 類庫包括四個名為 Timer 的類,每個類提供不同的功能:

  • System.Timers.Timer:定期觸發事件。 該類旨在用作多線程環境中的基於服務器或服務的組件。
  • System.Threading.Timer:定期在線程池線程上執行單個回調方法。 回調方法是在定時器實例化時定義的,不能更改。 與 System.Timers.Timer 類一樣,此類旨在用作多線程環境中的基於服務器或服務組件。
  • System.Windows.Forms.Timer:一個 Windows 窗體組件,它定期觸發一個事件。 該組件專為在單線程環境中使用而設計。
  • System.Web.UI.Timer:一個 ASP.NET 組件,它定期執行異步或同步網頁回發。

如果這是 Windows.Forms 應用程序,請改用System.Windows.Forms.Timer (您可以在工具箱/組件中找到它)。 它的Tick事件在 UI 線程中引發,因此可以從那里訪問您的控件。

如果您有使用System.Timers.Timer的特殊原因(例如精度),您必須將您的訪問權限包裝到一個Invoke調用中:

Invoke(new Action(() => { button1.Enabled = true; }));

您可以使用Invoke通過使用 UI 線程來更新 UI。

試試這個例子

private void timer_is_working(object source, ElapsedEventArgs e)
{
    ExecuteSecure(() => aTimer.Enabled = false);        
    ExecuteSecure(() => button1.Enabled = true);
}

private void ExecuteSecure(Action action)
{
    if (InvokeRequired)
    {
        Invoke(new MethodInvoker(() =>
        {
            action();
        }));
    }
    else
    {
        action();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM