C# 如何创建主线程对象并从其他线程添加到集合?

C# 如何创建主线程对象并从其他线程添加到集合?,c#,.net,wpf,multithreading,C#,.net,Wpf,Multithreading,编辑:好的,在构建了一个最小的示例来重现错误之后,我必须承认它正在工作(在Timer.Essed中创建自定义对象,通过Invoke更新ViewModel中的集合,并通过DataTemplate中的DataPiping单向绑定readonly GUI依赖属性到ViewModel。所有这些都不会冻结新创建的对象)。 然而,我的实际应用程序不起作用,我必须在其他地方找到错误 编辑2:好的,我找到了基本问题。我的自定义对象包含一个笔刷属性,它是一个DependencyObject,需要在主线程上创建。我

编辑:好的,在构建了一个最小的示例来重现错误之后,我必须承认它正在工作(在Timer.Essed中创建自定义对象,通过Invoke更新ViewModel中的集合,并通过DataTemplate中的DataPiping单向绑定readonly GUI依赖属性到ViewModel。所有这些都不会冻结新创建的对象)。 然而,我的实际应用程序不起作用,我必须在其他地方找到错误

编辑2:好的,我找到了基本问题。我的自定义对象包含一个笔刷属性,它是一个DependencyObject,需要在主线程上创建。我想我可以通过只冻结画笔或者干脆不在自定义对象中使用DependencyObject来解决这个问题。再次感谢各位,学到了很多

谢谢你们推动我创建这个最小的例子,我真的认为这是某种设计/模式问题,我不明白。当我在实际应用程序中发现了实际问题,但自己无法解决时,我将返回—并提供一个代码示例:D

我有一个基本问题找不到答案

我基本上想做的是:

我有一个ViewModel,它可以观察到自己的对象。此ObservableCollection绑定到ItemsControl,并且基于多个数据模板显示这些项。其中一些数据模板使用Dmitry Tashkinov的数据管道方法()将UIElement依赖属性推送到ViewModel。所有这些都很好

现在,我正试图在按下LeftMouseButton时将对象添加到ObservableCollecion(基本上是根据鼠标位置复制/粘贴所选对象)。起初,我使用了OnMouseMove事件,但由于在添加/显示对象和/或刷新鼠标位置时似乎有一些延迟,因此“鼠标比复制对象快”我需要在目标位置周围轻轻移动鼠标,以保持事件触发,直到粘贴初始位置和目标位置之间的所有对象。基本上这也可以,但是用户体验不好

我发现,在按下某个键时,所有的方法都是基于线程的。我尝试使用一个计时器,它在LeftMouseDown上启动,在LeftMouseUp上停止。在Timer.appeased事件中,我创建了新对象并尝试将其添加到ObservableCollection

问题是Timer.appeased方法和ObservableCollection在不同的线程上运行,我无法直接添加新对象。如果我从第二个线程调用collection.add方法来添加对象,我会得到一个XAMLParseException,表示DependencySource和DependencyObject需要在同一个线程上创建。此外,冻结对象不是一个选项,因为它们将在以后进行编辑

在使用invoke添加对象之前,是否有方法在主线程上复制该对象?或者有没有其他共同的模式来解决这个基本问题

问题是
Timer.appeased
方法和
observetecollection
在不同的线程上运行,我无法直接添加新对象。如果我从第二个线程调用collection.add方法来添加对象,我会得到一个XAMLParseException,表示DependencySource和DependencyObject需要在同一个线程上创建

解决方法是使用dispatcher将对
ObservableCollection
Add
方法的调用打包到UI线程:

private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    //...

    Application.Current.Dispatcher.BeginInvoke(new Action(() =>
    {
        //this code gets executed on the UI thread
        yourCollection.Add(...);
    }));
}
…或使用该方法使多个线程能够访问
ObservableCollection


如果您能提供到目前为止您的尝试的详细信息,那将是非常棒的。特别是因为从“基本问题”到“可观察的收集和多线程加计时器”还有很长的路要走。好的,我必须承认问题比预期的要长;)我将尝试构建一个最小的示例。但基本上,我认为这更可能是一个设计问题,而不是特定于我的代码的问题。我明天将发布一个简单的示例,实际上我现在有一个非常基本的工作示例,但没有GUI属性,所以我认为这就是问题所在。谢谢,我明天将对此进行研究。