如何将它们去除后,从列表中移除x秒物品

我需要删除列表几秒钟项目后我加入他们。 我现在有一个ObservableCollection,而我补充一些信息。 我需要他们被删除比方说加5秒后他们。 我试图创建负责添加项目和设置一个计时器功能:

public void AddInfoItem(string info) { infoList.Add(info); Timer newTimer = new Timer(5000); newTimer.Elapsed += new ElapsedEventHandler(this.TimerFunction); newTimer.Enabled = true; newTimer.Start(); } public void TimerFunction(Object sender, EventArgs e) { infoList.Clear(); }

我甚至没有派哪个项目应该被删除的原因第二个函数引发异常的参数。 有人可以描述一个妥善的解决办法,以一段时间后添加的项,并删除它?

索里的不早写它。 唯一的例外是

这种类型的CollectionView的不支持从一个线程更改其sourcecollection从dispatecher线程不同

--------------解决方案-------------

如果在WPF工作使用DispatcherTimer。 我通常使用的是这样的:

public static void Delay(int milliseconds, Action action)
{
var t = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(milliseconds) };
t.Tick += (o, e) => { t.Stop(); action.Invoke(); };
t.Start();
}

DispatcherTimer将确保该事件调用在同一个线程,这样你就不会遇到线程问题。 另一种选择是让你绑定到线程安全的集合。 不过说实在的,知道你收到,而不是猜测会更容易些什么样的异常。

另外,如果你添加和删除大量物品临门或要求你的时间是准确的,你就需要考虑其他的东西; DispatcherTimer不是很精确,的确具有一定的开销,所以它的很多实例会消耗一些资源。

而在计时器上​​移除从列表中的项目,为什么不储存的过期时间与它被添加在每个项目,而忽视或只有当你需要找回某个项目或重复列表中删除过期的项目?

听起来像无扩展工作。 这里有一个链接,以101接收样品,向您展示如何走了。

基本上你想要做什么(部分伪代码)

Observable
.FromEvent<NotifyCollectionChangedEventArgs>(infoList, "CollectionChanged")
.Where(args => args.Action == NotifyCollectionChangedAction.Add)
.Delay(TimeSpan.FromSeconds(5))
.ObserveOnDispatcher()
.Subscribe(args => infoList.Remove(args.NewItems));

无需处理定时器和无泄漏,只要你处置的订阅方法返回了IDisposable的,当你用它做。

编辑:无耻的自我插头-我做了一个博客帖子有一个工作的控制台应用程序的例子。 唯一的区别你必须是你要保持ObserverOnDispatcher()调用您的WPF应用程序,否则你会得到一些线程错误。

打桩到上述布莱恩的回答,这里是你如何通过ReactiveXaml的ReactiveCollection,的ObservableCollection的延伸,做到这一点:

theCollection.ItemsAdded
.Delay(TimeSpan.FromSeconds(5))
.Subscribe(theCollection.Remove);

确保您的垃圾收集器没有处置你的infoList的。 尝试GC.KeepAlive(infoList)

分类:WPF 时间:2012-01-01 人气:0
分享到:

相关文章

  • WPF定时器如C#定时器 2012-07-15

    我在哪里可以找到控制它类似于C#定时器控制在WPF? --------------解决方案------------- 通常的WPF定时器是DispatcherTimer ,这不是一个控制,但在代码中使用. 它基本上就像在WinForms的计时器以同样的方式: System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); dispatcherTim

  • WPF定时器problem-不能得到正确的毫秒滴答 2012-12-17

    我有一个关于定时器的一个基本问题. 我的计时器演戏很奇怪. 我想使刻度发生每毫秒更新我的数据. 我可以用秒来工作,现在看来,却并不毫秒.. 我使用WPF和很奇怪,为什么以下无法正常工作. 看来,"第二"倒计时工作正常,但在使用同样的程序和编辑一个值,它不"嘀"正确看来. 我想用下面做一个毫秒倒计时: //TimeSpan temp0 = new TimeSpan(0, 0, 0, 0, 1); CountdownTimer = new DispatcherTimer

  • WPF MVVM的ObservableCollection 2013-02-25

    我的模型有几个属性是字符串,另一个是一个observablecolletion. 当创建的模型它激发了一个BackgroundWorker线程基本上轮询数据一个.dll. 基于所述数据接收它要么设置串和/或添加和项观察的集合. 我的字符串属性似乎触发其Onproperty变化就好了和视图更新. 然而,我观察到的集合抛出一个跨线程异常. 我曾尝试移动代码,我设置ObesrvableCollection到worker.ReportProgress,并得到了同样的错误. 我提出逻辑到视图模型,并仍然得

  • 更新在WPF中的ObservableCollection用的EntityFramework主细项 2013-04-16

    遗憾的愚蠢的问题,但是这是我与WPF和Entity Framework第一种方法. 让我们来解释一下我的情况... 我有一个大师班(客户)和细节类(订单),无论是在我的EF上下文. 我打开我的主人类与LINQ到EF查询(包括订单),并把IEnumerable的结果在一个ObservableCollection,被用作源列表框设置. 然后,我有一个DataGrid,我加载命令. 现在,因为主项目是在一个ObservableCollection,我可以添加,删除和更新项目以及自动反映到我的列表框.

  • WPF绑定的ObservableCollection到列表框 2014-06-24

    我想绑定的ObservableCollection到列表框. 从调试输出不显示任何绑定错误,但出于某种原因,这是行不通的. XAML: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:nws

  • WPF与的ObservableCollection隐含的DataTemplate 2015-01-18

    我是新来WPF和MVVM使用. 我在我想根据什么用户选择菜单上显示不同的内容的图. 其中的一个事情是它有一个视图模型(TempVM),所以我这样做的另一个用户的控制温度: <ContentControl Content="{Binding Path=TempVM}"/> 和TempVM(类型TempViewModel)为null,直到用户点击一个按钮. 它的数据模板是这个 <DataTemplate DataType="{x:Type vm:TempView

  • 更新WPF中一个ObservableCollection导致屏幕闪烁; 我该如何预防呢? 2012-04-08

    我有一个MVVM模式绑定到WPFToolkit DataGrid的一个ObservableCollection. 每30秒我有一个后台线程的查询一些数据的服务. 当它返回时,乘警就到UI线程,并首先调用清除()的集合,然后调用Add()方法为每个项目更新的ObservableCollection. 当这种情况发生时,数据被适当地更新在屏幕上,然而,数据网格闪烁. 我怎样才能防止这种情况发生? --------------解决方案------------- 看来你只是更换所有的数据,如果你正在清理

  • WPF捕捉的ObservableCollection的项目属性更改 2012-09-27

    您好我是想这样做的几种方法,但无论是不成功或不理想. 我只是想赶上集合中的任何项目的PropertyChanged事件. 我已经手动连接起来的时刻,但我想知道如果有一个更优雅的解决方案: public class Item : INotifyPropertyChanged { ... public delegate void MyPropertyChangedHandler(object sender, PropertyChangedEventArgs e); public event MyPr

  • C#。 WPF。 的ObservableCollection如何获得当前项目 2012-11-28

    这是我收集: ObservableCollection<CheckInData> _CheckInCollection = new ObservableCollection<CheckInData>(); public ObservableCollection<CheckInData> CheckInCollection { get { return _CheckInCollection; } } public class CheckInData { public st

  • 做集合改变之前的东西在WPF中的ObservableCollection 2013-06-30

    我不知道什么,我试图实现实际上是可以实现与否. 我有我和collectionchanged事件一个ObservableCollection已经被处理. 我想要做的就是我想要在的ObservableCollection的collectionchanged事件被炒鱿鱼之前的的ObservableCollection对象的现有列表中的一些变化. 换句话说,我想做点什么对象的现有列表中的ObservableCollection之前任何添加或删除从任何的ObservableCollection对象. 像处

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.180 (s). 10 q(s)