[英]C# Executing a method with intervals using system.threading.timer
[英]Firing method on interval with System.Threading.Timer in winForm C#
我想要做的是使用System.Threading.Timer執行一個間隔的方法。 我的示例代碼看起來像這個atm。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.Threading.Timer t1 = new System.Threading.Timer(WriteSomething, null, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(10));
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Clear();
}
public void WriteSomething(object o)
{
textBox1.Text = "Test";
}
}
}
這個推測不是每10秒執行一次WriteSomething方法。 發生的事情是WriteSomething在我運行應用程序時執行,10秒后應用程序關閉。 想想我已經誤解了它是如何工作的,任何人都可以通過System.Threading.Timer告訴我如何做到這一點。
在此先感謝,代碼示例非常受歡迎
更可能的情況是它在10秒后崩潰 。 您無法觸及回調中的任何控件,它在錯誤的線程上運行。 您必須使用Control.BeginInvoke()。 這使得使用System.Threading.Timer而不是System.Windows.Forms.Timer 完全沒有意義 。
務實。 讓它達到100毫秒,這樣你就不會長胡子等待崩潰。 並且不要使用異步計時器來更新UI,這是沒用的。
僅供參考,System.Windows.Forms計時器沒有任何內容,它不允許您在代碼中創建(它不僅僅是一個“拖放”計時器)。 碼:
構造函數代碼:
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Tick += OnTimerTick;
timer.Interval = 10000;
timer.Start();
事件處理程序:
private void OnTimerTick(object sender, EventArgs e)
{
// Modify GUI here.
}
重申漢斯所說的,在WinForms應用程序中,所有GUI元素本身並不是線程安全的。 幾乎所有Control類的方法/屬性都只能在創建GUI的線程上調用。 System.Threading.Timer在線程池線程上調用它的回調,而不是在你創建定時器的線程上調用它(參見下面的MSDN參考)。 正如漢斯所說,你可能想要一個System.Windows.Forms.Timer,它將在正確的線程上調用你的回調。
您始終可以使用以下代碼驗證是否可以調用Control上的方法(確保您使用正確的線程):
System.Diagnostics.Debug.Assert(InvokeRequired!);
在你的事件處理程序中 如果斷言跳閘,則表示您處於無法修改此控件的線程上。
在您在構造函數中傳遞的回調方法上的System.Threading.Timer上的MSDN幫助中引用:
該方法不會在創建計時器的線程上執行; 它在系統提供的ThreadPool線程上執行。
常見錯誤:需要將timer變量保留為類成員,因為垃圾收集器可能會將其殺死。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.