タイムアウト後にObservableCollection<Notification>
からNotification
を削除します。追加されたアイテムごとに新しいThreadPoolスレッドを開始してそこにThread.Sleep
を入れるよりも良い方法はありますか? Nidonocuの回答に基づいてタイムアウト後にコレクションからアイテムを削除する
決勝コード:
public class NotificationCollection : ObservableCollection<Notification>
{
private readonly DispatcherTimer timer;
public NotificationCollection()
: this(Application.Current.Dispatcher)
{
}
public NotificationCollection(Dispatcher dispatcher)
{
this.timer =
new DispatcherTimer(DispatcherPriority.DataBind, dispatcher);
this.timer.Tick += this.TimerOnTick;
}
protected override void InsertItem(int index, Notification item)
{
base.InsertItem(index, item);
if (!this.timer.IsEnabled)
{
this.StartTimer(item);
}
}
private void StartTimer(Notification item)
{
var timeout = item.Timestamp + item.Timeout - DateTime.UtcNow;
if (timeout < TimeSpan.Zero)
{
timeout = TimeSpan.Zero;
}
this.timer.Interval = timeout;
this.timer.Start();
}
private void TimerOnTick(object sender, EventArgs e)
{
this.timer.Stop();
this.RemoveAt(0);
if (this.Count > 0)
{
this.StartTimer(this[0]);
}
}
例を挙げてください。 1つのスレッドのみを使用しているすべての試みは失敗しました。主に、スレッドがメインスレッドで削除されなければならないことが原因です。 – dtb
作業中... – Nidonocu
ありがとうございます。私はそれを少し修正し、結果を質問エリアに掲載しました。 – dtb