2014-08-28 24 views
0

你好,我正試圖實現這個功能,我有一個函數可以掃描我的數據庫,並在一段時間後可能會返回一個特定的值5mins。這個函數應該在後臺進程中運行,而不是以任何方式阻礙用戶。我已經閱讀了幾篇關於「背景工作者」和「線程化」的文章,但是我想就如何實現這一點提供一些指導。使用定時器在後臺進程中執行功能

如:

private void func() 
{ 
    MessageBox.Show("Hello World!"); 
} 

現在我想這個功能,只要在應用程序運行,一切都應該在一個後臺進程來完成每15分鐘執行,而無需中斷用戶,直到最終被顯示在消息框中。

+0

使用計時器。網上有很多可用的資源。 – 2014-08-28 10:53:56

+0

請注意[.NET中提供的不同定時器](http://msdn.microsoft.com/zh-cn/magazine/cc164015.aspx) – pinebit 2014-08-28 20:57:42

回答

1

下面的示例代碼中使用: -

// Create a 1 min timer 
    timer = new System.Timers.Timer(60000); 

    // Hook up the Elapsed event for the timer. 
    timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

    timer.Enabled = true; 


... 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    MessageBox.Show("Hello World!"); 
    // Your code 
} 
+1

這實際上很有用,謝謝。 – 2014-08-28 12:42:14

+0

很高興它幫助..plz標記爲答案,如果它是快速的@BlankEDjok – Neel 2014-08-28 13:27:14

+0

儘管快速的問題,爲什麼我無法從這個事件中訪問桌面控件? – 2014-08-28 13:38:14

0
Thread t = new Thread(new ThreadStart(func)); 

t.start(); 

private void func() 
{ 
while(true) 
{ 
    MessageBox.Show("Hello World!"); 
    Thread.Sleep(5000); 
} 
} 
+0

可怕的想法。爲什麼通過長時間睡眠來鎖定線程? – 2014-08-28 11:03:20

+0

這是什麼問題? @DanielKelley – 2014-08-28 11:13:03

+0

我認爲當你爲你的內涵添加一些解釋時,它對OP和更多訪問者會更有幫助。 – reporter 2014-08-28 11:27:56

0

我不知道有關 「沒有在所有任何方式妨礙用戶」,而是:

public static Thread Schedule(Action action, int delaysecs) 
{ 
    return new Thread(new ThreadStart(() => 
    { 
     DateTime dateTime = DateTime.Now; 
     while (true) { 
      if (DateTime.Now > dateTime) 
      { 
       action(); 
       dateTime.AddSeconds(delaysecs); 
      } 
      Thread.Sleep(1000); //Adjust for accuracy 
     } 
    })).Start(); 
} 

此代碼創建並返回保證每delaysecs秒執行action的線程。即使action需要超過一秒鐘,它也不會延遲下一個action,並且不會妨礙用戶體驗。 (如果它當然不重)

+0

這是一個糟糕的解決方案。爲什麼只創建一個線程才能讓它休眠? – 2014-08-28 11:03:57

+0

@DanielKelley我沒有看到問題,你能指出嗎? – KugBuBu 2014-08-28 11:04:41

+0

你創建一個線程,然後把它放到睡眠 - 這是一種資源浪費。見Neels的答案 - 一個計時器更合適。 – 2014-08-28 11:06:13

1

有很多方法來實現您的要求。最簡單的方法是在主窗體上使用TimerBackgroundWorker組件。

在計時器的每個Tick上,您會調用後臺工作人員的RunWorkerAsync方法。在DoWork活動中做好你的事情,並在RunWorkerCompleted中顯示你的結果,這樣你的申請就不會在MessageBox.Show的kaboom裏。

+0

但是我如何在計時器的tick事件中執行後臺工作者的do_work事件? – 2014-08-28 11:59:43

+0

'RunWorkerAsync'可以做到這一點 – edokan 2014-08-28 14:24:29