有时候我们需要更新UI元素上的数据,但是这个数据计算的时候非常的长,这就给ui线程,这个程序带来了 “冻结” . . .
例如我们先准备下面的UI:
当我们点击按钮时,计算出 1 到 1y 之间的偶数与奇数的个数,很明显这个计算量非常的大,计算的代码如下所示:
private void Calculator(int from, int to)
{
tmpJsValue = 0;
tmpEsValue = 0;
for (Int32 i = from; i < to; i++)
{
if (i % 2 == 0) ++tmpEsValue;
else ++tmpJsValue;
}
}
Int32 tmpJsValue = 0;
Int32 tmpEsValue = 0;
private void Button_Click(object sender, RoutedEventArgs e)
{
this.btn.IsEnabled = false;
this.esValue.Text = "0";
this.jsValue.Text = "0";
Calculator(0, 1000000000);
this.esValue.Text = tmpEsValue.ToString();
this.jsValue.Text = tmpJsValue.ToString();
this.btn.IsEnabled = true;
}
使用UI的线程计算效果如下所示:
这种情况在我们的程序中是不能发生的,下面我们利用线程池来解决这种问题,代码如下所示:
private void Calculator(int from, int to)
{
tmpJsValue = 0;
tmpEsValue = 0;
for (Int32 i = from; i < to; i++)
{
if (i % 2 == 0) ++tmpEsValue;
else ++tmpJsValue;
}
}
Int32 tmpJsValue = 0;
Int32 tmpEsValue = 0;
private void Button_Click(object sender, RoutedEventArgs e)
{
this.btn.IsEnabled = false;
this.esValue.Text = "0";
this.jsValue.Text = "0";
ThreadPool.QueueUserWorkItem(obj =>
{
Calculator(1, 1000000000);
Dispatcher.BeginInvoke(new Action(() =>
{
this.esValue.Text = tmpEsValue.ToString();
this.jsValue.Text = tmpJsValue.ToString();
this.btn.IsEnabled = true;
}));
});
}
效果如下所示: