[英]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.