wpf GUI线程中的线程太慢

时间:2012-03-28 10:30:14

标签: c# wpf multithreading

我的应用程序在另一个线程的后台工作,而后台线程中的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 个答案:

答案 0 :(得分:6)

你在异步编程中犯了#1罪。

你有一个忙碌的循环。而不是等待GlobalV.Attatched_Elements.Count改变,你不断地,不停地问“现在它是非零的吗?现在它是非零的吗?现在它是非零的吗?现在它是非零的吗?现在它是非零的吗?现在它是非零的吗?现在它是非零的吗?现在它是非零的吗?“,就像CPU可以做到的那样快。

换句话说,你浪费了大量的执行时间。

想要做的只是订阅一个事件,告诉您Count何时更改。然后,当它发生变化时,检查它是否为非零,并执行必要的处理。

答案 1 :(得分:1)

问题是,只要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) 
        {
            ...
        }
    }
}