线程不会同时启动
本文关键字:启动 线程 | 更新日期: 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。调度程序线程不应该像您正在做的事情那样进行繁重的工作。