Как отправить параметры метода делегата из одного потока в другой с помощью Dispacther.Invoke - PullRequest
0 голосов
/ 30 апреля 2020

Я сделал заявку в WPF. Образец этого приложения содержит класс usercontrol, который взаимодействует со вторым классом (myClass2.cs). Внутри myClass2.cs я создал Canvas как глобальную переменную в основном потоке. Затем я создаю новый поток, работающий как STA. Как только этот поток завершит обработку своих данных, я хочу отобразить данные на холсте, хранящемся в основном потоке. Для этого я создал делегат, который отправляет полилинию обратно в главный поток для построения графика. Я начинаю со следующего:

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)));

Поток теперь выполняется в основном потоке пользовательского интерфейса, но полилиния все еще принадлежит другим потоком и не могут быть доступны. Как передать полилинию в основной поток для обновления Canvas?

1 Ответ

2 голосов
/ 30 апреля 2020

Вы должны создать полилинию в том же потоке, где был создан Canvas, поскольку все элементы в визуальном дереве должны быть созданы в одном потоке.

Передать только точки полилинии из фонового потока в поток пользовательского интерфейса:

var points = new PointCollection(...); // in background thread

canvas.Dispatcher.Invoke(() => canvas.Children.Add(
    new Polyline
    {
        Points = points,
        Stroke = Brushes.Black,
        StrokeThickness = 2
    }));
...