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