【问题标题】:Update bound control from own background thread从自己的后台线程更新绑定控件
【发布时间】:2013-03-06 12:12:28
【问题描述】:

我有带有 MVVM 应用程序的 WPF。 ViewModel 和 View 是连接的。 View 中的控件绑定到 ViewModel,ViewModel 继承 INotifyChanged。 ViewModel 中的简单控件更新工作正常。

我想创建一些包含一些信息字段的信息类。接下来,我想创建自己的线程,将 Info 类中的字段映射到 ViewModel 中更新 View 的字段。 Info 类的对象将用作 ViewModel 中调用的函数的 arg。

private int someControl;
public SomeControl {
    get{return someControl;}
    set 
    {
        someControl = value;
        OnPropChanged("SomeControl");
    }

private InfoClass info = new InfoClass();
Thread thread = null;

public ViewModel()
{
    Thread thread = new Thread(new ThreadStart(update));
    thread.IsBackground = true;
    thread.start();

    someLongFunction(info);
}

private void update()
{
    SomeControl = info.someField;
    thread.sleep(1000);
    update();
}

我应该添加或更改什么来定期获取更新?现在,只有在 someLongFunction 结束其工作时才会更新。

【问题讨论】:

  • 我没有完全理解你...你想做什么?您想定期更新您的视图吗?
  • 确实,我想要那个功能:)
  • 递归调用你的更新方法最终会创建一个stackoverflow!好吧,您可以在System.Threading.Timer 中定义计时器,或者您必须使用线程同步原语(MutexEvent)。这会在someLongFunction 运行时发生吗?
  • 我没有得到stackoverflow,但也许我的应用程序运行时间太短了。我必须补充一点,如果我写 SomeControl += 1 而不是 SomeControl = info.someField;它工作正常。
  • 我没有说你有 stackoverflow,但你最终会明白的,一遍又一遍地递归调用你的方法。

标签: c# wpf multithreading mvvm


【解决方案1】:

如果您真正想要的是连续的视图更新,那么您不必为此创建线程,因为您必须在 Dispatcher 线程(UI 线程)上进行这些更新。相反,您可以使用 DispatcherTimer class,它专为这种情况而构建,您可以提供一个间隔,DispatcherTimer 将在该间隔定期调用您的方法,并在 Dispatcher 线程上自动执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多