C# 如何将事件从常规类传递到UI线程?
我有这样的结构C# 如何将事件从常规类传递到UI线程?,c#,wpf,C#,Wpf,我有这样的结构main窗口,在这里我从其他类调用这个方法addtaskbtcinked partial class MainWindow: Window { ... private void foo() { m_presenter.AddTaskBtnClicked(); } ... } 然后我的演示者 public class Presenter{ ... public ObservableCollection<string>
main窗口
,在这里我从其他类调用这个方法addtaskbtcinked
partial class MainWindow: Window
{
...
private void foo()
{
m_presenter.AddTaskBtnClicked();
}
...
}
然后我的演示者
public class Presenter{
...
public ObservableCollection<string> TaskList { get; } = new ...;
public void AddTaskBtnClicked() =>
FactoryTask?.StartNew(() =>
{
TaskList.Add(...);
}
...
我知道我可以在UI线程中移动这一行,或者不调用StartNew()
,但问题是我无法更改它。我需要设法让它工作,也许是使用调度程序。我发现这个答案非常正确
但问题是,所有这些绑定操作.EnableCollectionSynchronization
,var uiContext=SynchronizationContext.Current
或Dispatcher.Invoke
仅在从UI(用户控件或窗口)继承的类中工作
所以,问题是-如何从类中未继承表单UI的其他线程在可观察集合中添加项?为什么您已经发布的解决方案不起作用?因为您使用的是静态应用程序,所以不需要从UI组件继承来执行此操作。@Fruchtzwerg,当我编写这一行时
App.Current.Dispatcher.Invoke(…
VS告诉我它不知道App
是什么。并且提供创建本地App
var。但是如果我把这行放在我的main窗口的某个地方,它就可以了。看起来你没有包括你的App类的名称空间?@Fruchtzwerg我想App
类是一些系统类,不是吗?我需要怎么包括它是否保留此命名空间?当您说无法更改AddTaskBtnClicked时,无论是从Dispatcher操作调用它,还是使用BindingOperations.EnableCollectionSynchronization都会有所帮助。虽然前者不能阻止启动后台任务,但后者需要一个锁对象,该对象必须用于同步对集合的访问。
System.NotSupportedException: 'This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.'