2013-01-12 45 views
10

我正在開發一個WPF客戶端應用程序。此應用程序定期將數據發送到webservice。當用戶登錄到應用程序時,我希望每5 mts運行特定的方法將數據發送到.asmx服務。如何使用線程或定時器定期從WPF客戶端應用程序執行方法

我的問題是我是否需要使用線程或計時器。此方法執行應該發生在用戶與應用程序交互時。 即在此方法執行期間沒有阻止UI

要查找的任何資源?

回答

2

如果您希望方法在與UI不同的線程上執行,請使用System.Threading.Timer。否則(但我不認爲這是你的情況),請使用System.Windows.Threading.DispatcherTimer

+0

OK,我會在Mainwindow.xaml.cs主要方法寫這篇文章。即使打開子窗口,這個計時器也會打勾嗎?或者什麼是最好的地方放這個代碼,以便它在我應用程序的主窗口或任何一個子窗口中打勾? –

+0

@sateeshmunagala放置它的上下文不相關,只要在使用計時器時確保其容器類不會丟棄。 – Mir

8

您需要使用Timer類。有多個內置定時器,它取決於要使用哪個定時器。

  1. System.Timers.Timer:這更適合多線程訪問。這個定時器的實例是線程安全的。

  2. System.Threading.Timer:此計時器的實例不是線程安全的。

  3. System.Windows.Threading.DispatcherTimer - >它發送事件給Dispatcher線程(並且不是多線程的)。如果您需要更新UI,這很有用。

  4. System.Windows.Forms.Timer - >此計時器在UI線程中引發事件。這是針對Windows窗體進行優化的,而不是在WPF中使用。

以下是一個有趣的閱讀。
Comparing the Timer Classes in the .NET Framework Class Library

+0

感謝您的鏈接,但我對理解需求存在一些困難:客戶端可以與WPF應用程序平穩交互,同時向服務發送數據。兩者應同時發生。 這是我需要使用的內置定時器嗎? –

+0

它們是分開的(客戶端交互和發送數據)還是作爲從屬部分綁定在一起 – Tilak

+0

是的,它們是獨立的。用戶可以插入,更新,刪除數據,但我們將數據從數據庫發送到服務。 –

27

我將使用新的async/await關鍵字建議System.Threading.Tasks命名空間。

// The `onTick` method will be called periodically unless cancelled. 
private static async Task RunPeriodicAsync(Action onTick, 
              TimeSpan dueTime, 
              TimeSpan interval, 
              CancellationToken token) 
{ 
    // Initial wait time before we begin the periodic loop. 
    if(dueTime > TimeSpan.Zero) 
    await Task.Delay(dueTime, token); 

    // Repeat this loop until cancelled. 
    while(!token.IsCancellationRequested) 
    { 
    // Call our onTick function. 
    onTick?.Invoke(); 

    // Wait to repeat again. 
    if(interval > TimeSpan.Zero) 
     await Task.Delay(interval, token);  
    } 
} 

然後你只需調用這個方法的地方:

private void Initialize() 
{ 
    var dueTime = TimeSpan.FromSeconds(5); 
    var interval = TimeSpan.FromSeconds(5); 

    // TODO: Add a CancellationTokenSource and supply the token here instead of None. 
    RunPeriodicAsync(OnTick, dueTime, interval, CancellationToken.None); 
} 

private void OnTick() 
{ 
    // TODO: Your code here 
} 
+1

謝謝!我真的很喜歡你的方法! – lightxx

+0

我喜歡的方法,但如果我創建一個WriteableBitmap之前,while {}和WritePixels到while {}我收到Threading.Dispatcher.VerifyAccess()我認爲方法/任務是在一個單一的線程? –

+0

這種方法是並行嗎? –

相關問題