Dispatcher.BeginInvoke到不同的窗口

时间:2015-05-06 12:28:22

标签: c# wpf multithreading

Window让我们称之为W和类LogicW,在W的构造函数中,我将对该窗口的引用传递给LogicW

public W
{
    InitializeComponent();
    LogicW l = new LogicW(this);
}

LogicW我正在做所有的逻辑工作,所以现在我想在W开始新的线程,它会调用来自LogicW的方法做一些工作并添加{{1} } UserControll

W

public void add() { Thread t = new Thread(() => l.Add()); t.IsBackground = true; t.SetApartmentState(ApartmentState.STA); t.Start(); } 添加方法:

LogicW

其中: public void Add() { ... Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => baseWindow.GroupsStackPanel.Children.Add(i))); } 是对在LogicW构造函数中传递的W的引用 baseWindow是W的正常StackPanel GroupsStackPanel是UserControll

但我明白了:

i

我还尝试在参数中传递对该窗口的引用:

The calling thread cannot access this object because a different thread owns it.

我该如何解决?

3 个答案:

答案 0 :(得分:1)

1)。 也许它会帮助你看看MVP设计模式。有关分离逻辑/ ui的一般理解。

2)。 其他公布的解决方案正在发挥作用,但他们并非“最干净”的解决方案。解。您无法从另一个线程访问UI线程。 最好让你的线程完成一些工作,当他完成时,只需用你的新数据来更新UI,就会发出LogicW信号。

这可以很容易地将你的线程内容包装在一个新类中,并为它提供一个LogicW侦听的事件。 使用MVP模式时,此更新可以在您的" ShowModel"方法

答案 1 :(得分:0)

尝试

Set o = CreateObject("DllName.PublishFile")

答案 2 :(得分:0)

在这里你老兄:在anther线程中的方法然后做东西然后添加UI控件

private void StartAlgo()
    {
        while (Algo.CurrentAge <= Algo.MaxNumberOfAges)
        {
            Matrix = Algo.LearnAge(GeneratedPoints);
            this.Dispatcher.Invoke(new Action(() =>
            {
                View.Children.Clear();
                DrawPoints();
                DrawMatrix();
            }));

        }
    }

Dispatcher中的代码使用来自UI线程的控件(顺便说一下,这是WPF),所以如果你想添加一个按钮,例如只需在Dispacher中添加它

并调用线程:

private void AlgoBtn_Click(object sender, RoutedEventArgs e)
    {
        Thread alg = new Thread(StartAlgo);
        alg.Start();

    }