模型为在不同线程中使用的依赖项属性

本文关键字:依赖 属性 线程 模型 | 更新日期: 2023-09-27 18:37:22

我确实有以下szenario。我创建了一个遵循 MVVM 模式的 WPF C# 项目。此外,我开发了一个用户控件,它是某种图像抽屉。现在,我在视图模型中创建一个模型,并将其作为依赖项属性与用户控件共享。这是这样完成的:

用户控制:

public DXModel Model
    {
        get { return (DXModel)GetValue(ModelProperty); }
        set { SetValue(ModelProperty, value); }
    }
    public static readonly DependencyProperty ModelProperty =
        DependencyProperty.Register("Model", typeof(DXModel), typeof(DXControl),
                                    new PropertyMetadata(null, OnChanged));
    static void OnChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        (sender as DXControl).OnChanged();
    }
    void OnChanged()
    {
        if (Model != null)
            Model.PropertyChanged += new PropertyChangedEventHandler(Model_Changed);  // comes from the ui thread...comes only when init model...ok
        textTitle.Text = Model.Title;
        internalModel = (DXModel)Model;
    }
    void Model_Changed(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (!receiveTimer.Enabled)
        {
            receiveTimer.Interval = receiveDelay;
            receiveTimer.Start();
            refreshTimer.Start();
        }
    }

因此,当模型在视图模型中更改时,我还获得了事件,然后我执行绘图。基本上,我有一个点列表,我每秒在视图模型中完全覆盖几次:

视图模型:

dxModel1.Series[0].Points = list1;

在用户控件中,点每秒也会重绘几次。为此,我必须首先遍历这些要点:

用户控制:

int length = internalModel.Series[i].Points.Count-1;
float lastX = internalModel.Series[i].Points[0].X;
for (int j = 0; j <= length; j++)
    {
      float x = ((float)targetImage.Width - 0) / (internalModel.Axes[0].Max - internalModel.Axes[0].Min) * (internalModel.Series[i].Points[j].X- lastX - internalModel.Axes[0].Min);
      float y = (0 - (float)targetImage.Height) / (internalModel.Axes[1].Max - internalModel.Axes[1].Min) * (internalModel.Series[i].Points[j].Y - internalModel.Axes[1].Min) + (float)targetImage.Height;
      tmpPoints.Add(new SharpDX.Vector2(x, y));
    }

重要的是,模型在视图模型的工作线程中更改。用户控件位于 UI 线程中。我遇到的问题是,这种通过点的迭代不时给我一个例外。我想,这是因为在迭代点的同时,这些点在工作线程中被覆盖。

我试图将内部模型锁定在用户控件中,将 dxModel1 锁定在视图模型中,但这对我没有帮助。

的方法是否正确,为什么它失败了,如果是这样,我该如何克服这个问题?

模型为在不同线程中使用的依赖项属性

如果您

正在使用 .net4.5,我认为在您的方法中使用 async-await 应该可以解决这个问题。 我遇到的一些链接: http://www.i-programmer.info/programming/c/1514-async-await-and-the-ui-problem.html

我不确定我是否完全理解您的问题,因为您没有告诉我们Exception细节,但是如果您只想确保您的代码在UI线程上运行,则可以执行以下操作:

RunOnUiThread((Action)delegate()
{
    int length = internalModel.Series[i].Points.Count-1;
    float lastX = internalModel.Series[i].Points[0].X;
    for (int j = 0; j <= length; j++)
    {
        float x = ((float)targetImage.Width - 0) / (internalModel.Axes[0].Max - internalModel.Axes[0].Min) * (internalModel.Series[i].Points[j].X- lastX - internalModel.Axes[0].Min);
        float y = (0 - (float)targetImage.Height) / (internalModel.Axes[1].Max - internalModel.Axes[1].Min) * (internalModel.Series[i].Points[j].Y - internalModel.Axes[1].Min) + (float)targetImage.Height;
        tmpPoints.Add(new SharpDX.Vector2(x, y));
    }
});
...
public object RunOnUiThread(Delegate method)
{
    return Dispatcher.Invoke(DispatcherPriority.Normal, method);
}