如何使用 Dispacther.Invoke 将委托方法的参数从一个线程发送到另一个线程
How do I send parameters of a delegate method from one thread to another with Dispacther.Invoke
我做了一个WPF应用程序。此应用程序的示例包含一个用户控件 class,它与第二个 class (myClass2.cs) 交互。在 myClass2.cs 中,我在主线程上创建了一个 Canvas 作为全局变量。然后我创建一个新线程 运行 作为 STA。一旦这个线程处理完它的数据,我想在主线程上存储的 Canvas 上绘制数据。为了做到这一点,我创建了一个委托,它将一条多段线发送回主线程进行绘图。我从以下开始:
public delegate void canvasDel (Polyline polyline);
canvasDel handler = updateUI;
public void updateUI(Polyline polyline)
{
canvas.Children.Add(polyline);
}
然后我使用应用程序调度程序和 Invoke。
Application.Current.Dispatcher.Invoke(new Action(() => handler(polyline)));
该线程现在 运行 在主 UI 线程上,但折线仍由另一个线程拥有,无法访问。如何将折线传递给主线程以更新 Canvas?
您必须在创建 Canvas 的同一线程中创建折线,因为可视化树中的所有元素都必须在同一线程中创建。
仅将折线点从后台线程传递到 UI 线程:
var points = new PointCollection(...); // in background thread
canvas.Dispatcher.Invoke(() => canvas.Children.Add(
new Polyline
{
Points = points,
Stroke = Brushes.Black,
StrokeThickness = 2
}));
我做了一个WPF应用程序。此应用程序的示例包含一个用户控件 class,它与第二个 class (myClass2.cs) 交互。在 myClass2.cs 中,我在主线程上创建了一个 Canvas 作为全局变量。然后我创建一个新线程 运行 作为 STA。一旦这个线程处理完它的数据,我想在主线程上存储的 Canvas 上绘制数据。为了做到这一点,我创建了一个委托,它将一条多段线发送回主线程进行绘图。我从以下开始:
public delegate void canvasDel (Polyline polyline);
canvasDel handler = updateUI;
public void updateUI(Polyline polyline)
{
canvas.Children.Add(polyline);
}
然后我使用应用程序调度程序和 Invoke。
Application.Current.Dispatcher.Invoke(new Action(() => handler(polyline)));
该线程现在 运行 在主 UI 线程上,但折线仍由另一个线程拥有,无法访问。如何将折线传递给主线程以更新 Canvas?
您必须在创建 Canvas 的同一线程中创建折线,因为可视化树中的所有元素都必须在同一线程中创建。
仅将折线点从后台线程传递到 UI 线程:
var points = new PointCollection(...); // in background thread
canvas.Dispatcher.Invoke(() => canvas.Children.Add(
new Polyline
{
Points = points,
Stroke = Brushes.Black,
StrokeThickness = 2
}));