2013-11-21 41 views
0

我有一個kyosk的WPF應用程序。WPF如何在特定間隔加載XML文件

應用程序每隔一小時從遠程服務器加載XML內容。

我需要每小時調用一次服務器(我不需要絕對精度)並更新應用程序(下載後臺數據綁定到UI的更新對象)。

什麼是在WPF應用程序中做更簡單的方法。如果可能,請提供代碼示例。

+2

從某些[timer](http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatchertimer(v = vs.110).aspx)和[DownloadStringAsync](http: //msdn.microsoft.com/en-us/library/ms144202(v=vs.110).aspx) – Alberto

+0

@Alberto,你似乎有正確的想法...你會不會添加一個答案,並提供問題作者與一些示例代碼? – Sheridan

回答

1

有很多方法可以創建定期刷新。這是一個包含簡單線程循環的代碼片段...

public partial class MainWindow : Window 
    { 
     private bool _isActive; 
     public MainWindow() 
     { 
      InitializeComponent(); 
      StartXmlRefresher(5000); 
     } 
     private void StartXmlRefresher(int sleepMilliseconds) 
     { 
      _isActive = true; 
      Task.Run(() => 
       { 
        while (_isActive) 
        { 
         RefreshXml(); 
         if(_isActive) Thread.Sleep(sleepMilliseconds); 
        } 
       }); 
     } 
     private void RefreshXml() 
     { 
      Console.WriteLine(@"Refresh started"); 
      // your stuff here 
      Console.WriteLine(@"Refresh completed"); 
     } 
    } 

線程循環直到_isActive成員設置爲false。每次刷新後,線程將休眠指定的時間。您也可以使用任何計時器變體來做同樣的事情。

注意:此片段用於.net 4.5。如果您使用的是較低版本的版本,則需要使用任務工廠啓動該線程。這裏是展示瞭如何使用工廠啓動一個線程的一個片段:

private void StartXmlRefresherWithFactory(int sleepMilliseconds) 
{ 
    _isActive = true; 
    Task.Factory.StartNew(() => 
    { 
     while (_isActive) 
     { 
      RefreshXml(); 
      Thread.Sleep(sleepMilliseconds); 
     } 
    }); 
} 

調用StartNew在功能上等同於創建一個使用它的構造函數中的一個任務,然後調用開始以安排執行。來源:http://msdn.microsoft.com/en-us/library/dd321439(v=vs.100).aspx

4.5 Task.Run方法本質上是工廠方法的語法糖,所以無論你使用哪一個都會得到相同的結果。

對不起格式化;今天似乎沒有工作。

+0

你可以發佈一個使用任務工廠的例子嗎?謝謝 – GibboK

+1

@GibboK,我修改了包含這兩種方法的答案,並加上了MSDN dox的鏈接。它看起來像格式化程序再次amok雖然 –

+0

非常感謝您的幫助 – GibboK