wpf - 可以使用BackgroundWorker的ReportProgress来做其他事情吗?

标签 wpf mvvm backgroundworker

我正在使用MVVM方法编写WPF应用程序。在我的ViewModel中,我有一个ObservableCollection。我的应用程序需要定期检查新消息,如果有,则需要将它们添加到ObservableCollection中。

如果我尝试在DoWork中添加到ObservableCollection,则由于线程同步问题而无法正常工作。看起来最简单的方法是在UI线程上执行此操作,方法是执行ReportProgress()并从那里更新集合。

我的问题是:从理论上和技术上,可以从ReportProgress处理程序更新UI,即使“按法律规定”我实际上并未报告进度。

还有更完善的方法吗?

*编辑:代码使用调度程序计时器运行*

View 模型

class MyViewModel
{
    public ObservableCollection<string> MyList { get; set; }

    public MyViewModel()
    {
        MyList = new ObservableCollection<string>();
    }
}

“teh codez”-只是一个示例,不是我的实际应用程序代码。
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

        MyViewModel mvm = new MyViewModel();
        this.DataContext = mvm;

        DispatcherTimer mytimer = new DispatcherTimer();
        mytimer.Interval = TimeSpan.FromSeconds(5.0);
        mytimer.Tick += new EventHandler(mytimer_Tick);

        mytimer.Start();


    }

    void mytimer_Tick(object sender, EventArgs e)
    {
        ((DispatcherTimer)sender).Stop();

        MyViewModel mvm = this.DataContext as MyViewModel;
        mvm.MyList.Insert(0, DateTime.Now.ToLongTimeString());

        ((DispatcherTimer)sender).Start();
    }

看起来它可以很好地满足我的需求,并且不会给我多余的行李(例如取消,工作人员完成等)。

最佳答案

如果您要在应用程序中实现轮询类型的功能,则使用DispatcherTimer间隔触发一次而不是不断在BackgroundWorker内部循环运行可能更有意义。

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx

关于wpf - 可以使用BackgroundWorker的ReportProgress来做其他事情吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3454918/

相关文章:

c# - 绑定(bind) List<string> 到 ComboBox

vb.net - 使用事件从具有另一个类的后台工作人员更新 UI

c# - 我需要担心 Canvas 上的最佳绘图吗?

c# - Windows 版本在设计中显示出真正的值(value),但在我运行程序时显示出不同的值(value)

wpf - WPF 中的环境遮挡着色器效果?

c# - 如何在 WPF 中调整多边形的大小?

wpf - MVVM:所有 View 的一个 View 模型结构与每个 View 单独的 View 模型结构?

c# - 如何使用 MVVM 在 WPF 中实现 NetworkAvailabilityChanged?

c# - 链中的多个后台 worker

c# - 为什么我只能从 BackgroundWorker 访问某些 UI 控件属性?