簡體   English   中英

在WinForm C#中使用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.

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