Потоки в потоке GUI wpf слишком медленные - PullRequest
2 голосов
/ 28 марта 2012

Мое приложение должно работать в фоновом режиме в другом потоке, и результат рисования в Gui из списка фонового потока заполняет этот список

При инициализации я создал фоновый поток, и когда я нажимаю кнопку в Gui, этот поток начинаетсяза работой ;и я нажимаю на другую кнопку, чтобы прочитать результат, пока работает фоновый поток, но GUI очень и очень медленно реагирует на результат.

Есть ли какое-либо решение, которое я хочу, чтобы мои результаты отображались в GUI быстрее?

мой код:

Thread startdrawingthread = new Thread(StartDrawing);

public MainWindow()
{
    InitializeComponent();
}

private void bt_draw_Click(object sender, System.Windows.RoutedEventArgs e)
{
    if (ch_single.IsChecked == true || ch_entire.IsChecked == true)
    {
        currentMode = "";
        startdrawingthread.Start();
        //StartDrawing();
        real_area.DrawingArea.Children.Clear();
        real_area.DrawGrid(20);
    }
}

private void bt_single_next_Click(object sender, System.Windows.RoutedEventArgs e)
{
    if (GlobalV.isfinished == false)
    {
        while (true)
        {
            if (GlobalV.Attatched_Elements.Count > 0)
            {
                try
                {
                    real_area.DrawingArea.Children.Clear();
                    real_area.DrawGrid(20);
                    real_area.DrawElement(GlobalV.Attatched_Elements[i]);
                    i++;
                }
                catch
                {
                }
                break;
            }
        }
   }

}

Ответы [ 2 ]

6 голосов
/ 28 марта 2012

Вы совершили грех # 1 в асинхронном программировании.

У вас занятая петля. Вместо того, чтобы ждать, пока GlobalV.Attatched_Elements.Count изменится, вы постоянно безостановочно спрашиваете: «теперь он ненулевой? Теперь он ненулевой? ненулевой сейчас? это ненулевой сейчас? ", так быстро, как процессор может это сделать.

Другими словами, вы тратите много времени на выполнение.

То, что вы хотите сделать, это просто подписаться на событие, сообщающее вам, когда Count изменится. Затем, когда он изменяется, вы проверяете, не является ли он ненулевым, и выполняете необходимую обработку.

1 голос
/ 28 марта 2012

Проблема в том, что пока GlobalV.Attatched_Elements.Count равен нулю, ваш обработчик событий проходит бесконечный цикл while (true).

Я предполагаю, что GlobalV.Attatched_Elements.Count установлено где-то в StartDrawing, ноВы не можете быть заняты - подождите, пока это не станет больше нуля.Возможно, вам следует удалить целые блоки if (GlobalV.isfinished == false) и while (true) и просто сделать следующее, что особенно ничего не делает, если нечего делать:

private void bt_single_next_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    if (GlobalV.Attached_Elements.Count > 0) 
    {
        ...
    }
}

может быть также с lock Сбор коллекции для многопоточного доступа:

private void bt_single_next_Click(object sender, System.Windows.RoutedEventArgs e) 
{
    lock (GlobalV.Attached_Elements)
    {
        if (GlobalV.Attached_Elements.Count > 0) 
        {
            ...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...