在我的WPF應用程序中,UI顯示的數據將會更新頻率過高。 我發現保留完整的邏輯並且用一個額外的類來解決這個問題是很好的,這個額外的類存儲了最新的數據並且在一些延遲後引發了更新事件。在一段時間後用最近的數據提起事件
所以我們的目標是更新用戶界面,讓我們說每隔50毫秒,並顯示最新的數據。但是如果沒有新的數據顯示,那麼UI不會被更新。
這是我迄今爲止創建的一個實現。有沒有辦法做到這一點沒有鎖定?我的實現是否正確?
class Publisher<T>
{
private readonly TimeSpan delay;
private readonly CancellationToken cancellationToken;
private readonly Task cancellationTask;
private T data;
private bool published = true;
private readonly object publishLock = new object();
private async void PublishMethod()
{
await Task.WhenAny(Task.Delay(this.delay), this.cancellationTask);
this.cancellationToken.ThrowIfCancellationRequested();
T dataToPublish;
lock (this.publishLock)
{
this.published = true;
dataToPublish = this.data;
}
this.NewDataAvailable(dataToPublish);
}
internal Publisher(TimeSpan delay, CancellationToken cancellationToken)
{
this.delay = delay;
this.cancellationToken = cancellationToken;
var tcs = new TaskCompletionSource<bool>();
cancellationToken.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: false);
this.cancellationTask = tcs.Task;
}
internal void Publish(T data)
{
var runNewTask = false;
lock (this.publishLock)
{
this.data = data;
if (this.published)
{
this.published = false;
runNewTask = true;
}
}
if (runNewTask)
Task.Run((Action)this.PublishMethod);
}
internal event Action<T> NewDataAvailable = delegate { };
}
您的數據來自哪裏?你可以放棄較舊的部分,而不是最新的部分? – Noseratio
數據來自任務(精確包裝Web客戶端)。 我完全沒有損失舊件 - 它只是爲了顯示當前狀態。 – Kuba