我正在開發一個WPF
客戶端應用程序。此應用程序定期將數據發送到webservice
。當用戶登錄到應用程序時,我希望每5 mts運行特定的方法將數據發送到.asmx
服務。如何使用線程或定時器定期從WPF客戶端應用程序執行方法
我的問題是我是否需要使用線程或計時器。此方法執行應該發生在用戶與應用程序交互時。 即在此方法執行期間沒有阻止UI
要查找的任何資源?
我正在開發一個WPF
客戶端應用程序。此應用程序定期將數據發送到webservice
。當用戶登錄到應用程序時,我希望每5 mts運行特定的方法將數據發送到.asmx
服務。如何使用線程或定時器定期從WPF客戶端應用程序執行方法
我的問題是我是否需要使用線程或計時器。此方法執行應該發生在用戶與應用程序交互時。 即在此方法執行期間沒有阻止UI
要查找的任何資源?
如果您希望方法在與UI不同的線程上執行,請使用System.Threading.Timer
。否則(但我不認爲這是你的情況),請使用System.Windows.Threading.DispatcherTimer
。
您需要使用Timer
類。有多個內置定時器,它取決於要使用哪個定時器。
System.Timers.Timer:這更適合多線程訪問。這個定時器的實例是線程安全的。
System.Threading.Timer:此計時器的實例不是線程安全的。
System.Windows.Threading.DispatcherTimer - >它發送事件給Dispatcher
線程(並且不是多線程的)。如果您需要更新UI,這很有用。
System.Windows.Forms.Timer - >此計時器在UI線程中引發事件。這是針對Windows窗體進行優化的,而不是在WPF中使用。
以下是一個有趣的閱讀。
Comparing the Timer Classes in the .NET Framework Class Library
感謝您的鏈接,但我對理解需求存在一些困難:客戶端可以與WPF應用程序平穩交互,同時向服務發送數據。兩者應同時發生。 這是我需要使用的內置定時器嗎? –
它們是分開的(客戶端交互和發送數據)還是作爲從屬部分綁定在一起 – Tilak
是的,它們是獨立的。用戶可以插入,更新,刪除數據,但我們將數據從數據庫發送到服務。 –
我將使用新的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
}
謝謝!我真的很喜歡你的方法! – lightxx
我喜歡的方法,但如果我創建一個WriteableBitmap之前,while {}和WritePixels到while {}我收到Threading.Dispatcher.VerifyAccess()我認爲方法/任務是在一個單一的線程? –
這種方法是並行嗎? –
OK,我會在Mainwindow.xaml.cs主要方法寫這篇文章。即使打開子窗口,這個計時器也會打勾嗎?或者什麼是最好的地方放這個代碼,以便它在我應用程序的主窗口或任何一個子窗口中打勾? –
@sateeshmunagala放置它的上下文不相關,只要在使用計時器時確保其容器類不會丟棄。 – Mir