2013-02-06 76 views
-4

我有一個函數,我想運行它每隔1秒,旁邊,我有其他的東西, ,因爲即時通訊使用我的其他功能上的線程,並避免窗口崩潰,我決定使用Backgroundworker調用函數,假設運行像這樣:WPF,爲什麼我的BackgroundWorker函數只運行一次?

Main() 
{ 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    worker.RunWorkerAsync(); 
} 

public void worker_DoWork(object sender, EventArgs e) 
{ 
    AutoChecking(); // thats a function should Run on Background every 1 second 
} 

public void AutoChecking() 
{ 
    this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => 
    { 
     if (SystemisGood == true) 
      Updatecolor.Fill = Green; 
     else 
      Updatecolor.Fill = Red; 
    })); 
} 

然而,這個功能只能工作一次現在的任何理由或解決方案,使其每秒工作,並保持backgroundworker?! PS:我不想使用計時器...

+4

爲什麼你不想使用計時器?這就是他們的目的。 –

+0

我寧願只用這個,因爲計時器會阻止我的主要功能線程... – PublicAffair

+0

你可以發佈代碼如何使用計時器阻止你的用戶界面?使用backgroundworker作爲定時器並不是真正的好方法 –

回答

1

這是浪費的不使用計時器,因爲這些是非常輕量級的,只是發送一個定期的消息,但你可以通過使用低開銷輪詢循環和檢查時間,就像計時器代碼本身所做的一樣。例如:

Main() 
{ 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    worker.RunWorkerAsync(); 
} 

bool exitBGThread = false; 

public void worker_DoWork(object sender, EventArgs e) 
{ 
    TimeSpan interval = new TimeSpan(0, 0, 1); 
    while (!exitBGThread) 
    { 
     DateTime start = DateTime.Now; 
     AutoChecking(); // thats a function should Run on Background every 1 second 

     while (!exitBGThread) 
     { 
      DateTime cur = DateTime.Now; 
      if (cur - start >= interval) 
       break; 
      Thread.Sleep(100); 
     } 
    } 
} 

public void AutoChecking() 
{ 
    this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => 
    { 
     if (SystemisGood == true) 
      Updatecolor.Fill = Green; 
     else 
      Updatecolor.Fill = Red; 
    })); 
} 

這是一個有點簡單化,你會想用鎖{}如果你實際使用exitBGThread,但你的想法。

+0

其welldone代碼,但仍然凍結我的窗口一旦我試圖移動窗口周圍屏幕升技 – PublicAffair

+0

這是沒有辦法這個代碼凍結你的窗口。它運行在後臺線程中,延遲非常低 - 它每秒鐘執行10次簡單的時間檢查。 –

+1

也許他在SystemIsGood屬性中做了一些冗長的同步操作來檢查系統是否良好:)....是淘氣...在這種情況下,它需要移動到BackgroundWorker線程 –

相關問題