如何在多个线程中使用复制(或相同)对象

本文关键字:复制 对象 线程 | 更新日期: 2023-09-27 18:33:34

我正在尝试在应用程序中设置警告窗口。该窗口需要在单独的线程上运行,并包含描述失败对象的 Canvas。Canvas 已经存在于主应用程序中,我需要的只是在警告窗口中显示相同的 Canvas。问题是我收到一个错误,说另一个线程拥有该对象。我尝试使用此方法进行深度复制,但没有运气。我错过了什么,还是真的没有简单的方法来复制画布或图像集合。或者,是否可以进行深复制,然后更改复制对象的踏面亲和力?

我应该认为以前有人遇到过这个问题,但是我的战术这次没有给我任何相关的结果。

提前感谢!-鲁努里

编辑 1

    private Canvas cloneCanvas()
    {
        Canvas testcanv = new Canvas();
        Dispatcher.Invoke(new Action(delegate
        {
            var t = SomeViewModel.GetCanvasWithImages();
            testcanv = CopyCanvas(t);
        }));
        return testcanv;
    }
    public static UIElement DeepCopy(UIElement element)
    {
        if (element != null)
        {
            var xaml = XamlWriter.Save(element);
            var xamlString = new StringReader(xaml);
            var xmlTextReader = new XmlTextReader(xamlString);
            var deepCopyObject = (UIElement)XamlReader.Load(xmlTextReader);
            return deepCopyObject;
        }
        return null;
    }
    private Canvas CopyCanvas(Canvas inputCanvas)
    {
        if (inputCanvas != null)
        {
            var outputCanvas = new Canvas();
            foreach (UIElement child in inputCanvas.Children)
            {
                outputCanvas.Children.Add(DeepCopy(child));
            }
            return outputCanvas;
        }
        return null;
    }

如何在多个线程中使用复制(或相同)对象

您可以单例模式来维护一个警告窗口的对象。

当您想将画布放入警告窗口时,您必须使用调度程序。

调度程序会将方法调用封送到 UI 线程上。

类似的东西

  warningWindow.Dispatcher.Invoke(
      System.Windows.Threading.DispatcherPriority.Normal,
      new Action(
        delegate()
        {
          myCheckBox.IsChecked = true;
        }
    ));

其中警告窗口将通过单一实例可用