最好的方式實現這一目標是將BackgroundWorker與INotifyPropertyChanged結合使用
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
和執行財產
private string _value;
public string Value
{
get { return _value; }
set
{
if(value.Equals(_value)) return;
_value = value;
NotifyPropertyChanged("Value");
}
}
調用方法
private void Foo()
{
var rand = new Random(DateTime.Now.Millisecond);
for (var i = 0; i < 50; i++)
{
Value += rand.Next(1, 10) + "\n";
System.Threading.Thread.Sleep(500);
}
}
事件DoWork的BackgroundWorker的這樣
private void Button_Click(object sender, RoutedEventArgs e)
{
var worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
Foo();
}
這將暫停期間發生的任何其他操作睡覺;也因爲循環,你將被調用sleep()和調用DoEvents()1000倍成一排,它不能很好的性能。 – 2011-12-18 17:43:51
好吧,這是一種可以讓你的用戶界面freez無法延遲的方式。 – 2011-12-18 17:46:25
不是一個好的答案。因爲1)的DoEvents()是一個危險的特技和2)的Sleep()具有約20毫秒的分辨率。你的方法會睡15-25倍的時間比你想象的。 – 2011-12-18 17:49:16