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.'