【发布时间】:2013-01-25 16:43:55
【问题描述】:
我对 WPF 很陌生。我正在开发一个 PRISM 应用程序,并希望在更新可枚举时更新 UI。
我在我的模型视图中使用 backgroundWorker 来更新枚举。一切正常,直到它自己的枚举被更新然后用户界面冻结!
一位朋友告诉我,我也许可以使用 yield 关键字,但我不太明白。
代码如下:
public void ChangeCollection()
{
BackgroundWorker worker = new BackgroundWorker();
// Set workers job
worker.DoWork += (sender, e) =>
{
RunOnUIThread(() => IsBusy = true);
e.Result = GetPrimes();
};
// On Complete
worker.RunWorkerCompleted += (sender, e) =>
{
RunOnUIThread(() =>
{
IsBusy = false;
// HERE IS WHERE IT GETS STUCK
Numbers = new ObservableCollection<int>
((IEnumerable<int>)e.Result);
});
};
// Start background operation
worker.RunWorkerAsync();
}
public ObservableCollection<int> Numbers
{
get {return _Numbers;}
set
{
_Numbers = value;
RaisePropertyChanged(() => Numbers);
}
}
public IEnumerable<int> GetPrimes()
{
List<int> primes = new List<int>();
for (int i = 0; i < 100000; i++)
{
bool IsPrime = true;
for (int j = 2; j < i; j++)
{
if (i % j == 0)
IsPrime = false;
}
if (IsPrime)
primes.Add(i);
}
return primes;
}
任何建议将不胜感激!
谢谢, 暗里
【问题讨论】:
-
什么绑定到
Numbers?我怀疑如果您在DataGrid或ComboBox中显示 9592 个项目,无论如何它都会很慢。 -
您的代码看起来不错。您是否尝试过记录消息以确定挂起开始的时间点?
-
GetPrimes()当然只是一个例子:) 我的绑定如下DataGridTextColumn Header="Numbers" Binding="{Binding Mode=OneWay}" -
除非您要在 UI 线程上添加和删除,否则我会使用 List 而不是 ObservableCollection。并让 GetPrimes 返回列表。
标签: c# wpf multithreading backgroundworker