线程不会同时启动

本文关键字:启动 线程 | 更新日期: 2023-09-27 18:34:06

这里有一个更新画布背景和元素的类,我想让背景与元素分开更新,因为元素更新需要相当多的时间,但是当我使用线程时,我没有注意到任何区别,当我暂停其中一个时,它们都被暂停了,所以我想两者都在同一个线程上,这是代码

namespace 
{
    class CanvasHandler
    {
        private Canvas _canvas;
        private Grid gird;
        private Brush _image;
        private UiHandler uiHandler;
        private Thread thread,thread1;
        public CanvasHandler(Canvas canvas, UiHandler uiHandler)
        {
            this._canvas = canvas;
            this.uiHandler = uiHandler;
            this.gird = this._canvas.Parent as Grid;
        }
        public void Update()
        {
            thread = new Thread(UpdateImage);
            thread.Start();
            thread1 = new Thread(UpdateCanvas);
            thread1.Start();

        }
        public void UpdateImage()
        {
            this._canvas.Dispatcher.BeginInvoke((Action)(() => this._canvas.Background = uiHandler.SourceCanvas.Background));
        }
        public void UpdateCanvas()
        {
            this._canvas.Dispatcher.BeginInvoke((Action)(UpdateCanvas_));

        }
        private void UpdateCanvas_()
        {
            Thread.Sleep(500);
            this._canvas.Children.Clear();
            foreach (UIElement child in uiHandler.SourceCanvas.Children)
            {
                var clone = Clone(child);
                this._canvas.Children.Add(clone);

            }
        }
        public T Clone<T>(T source)
        {
            string objXaml = XamlWriter.Save(source);
            var stringReader = new StringReader(objXaml);
            XmlReader xmlReader = XmlReader.Create(stringReader);
            var t = (T)XamlReader.Load(xmlReader);
            return t;
        }
    }
}

线程不会同时启动

你在这里不是多线程。这两个函数都在调度程序线程中执行。

您已经多线程调用调度程序来处理这些函数,这没有用,因为 BeginInvoke 调用是异步的。

您应该做的是在线程中进行所有工作(克隆功能),然后根据它更新 UI。调度程序线程不应该像您正在做的事情那样进行繁重的工作。