如何使用 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
    }));