我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.
我该如何解决?
答案 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();
}