我在使用后台工作人员创建我的对象模型时遇到了麻烦。如何从backgroundWorker线程创建通用控件?
据我了解为什么,我无法找到解决方法。
这里是伪逻辑:
呼叫web服务异步
接收。当,在Load方法背景
打开背景工人,和数据装载到控制,搜索现有对象,如果找不到,则创建一个新对象。
所有创建的对象都从Control继承(具有透明抽象层)。
虽然我在主线程创建控件,功能,做工精细:
public static T Find<T>(ObservableCollection<T> collection, int objectId)
where T : FormaliteBaseControl, new()
{
foreach (T item in collection)
{
if (item.ObjectId == objectId)
return item;
}
return new T();
}
当然,从后台线程调用时,一个跨线程异常的“新T()” 发生在Silverlight ,无法同步调用Dispatcher.Invoke。
虽然我以这种方式创建了大约450个对象,但我希望将对象模型创建保留在后台而不会降低Thread.Sleep或其他“好”方法的性能。
感谢您的回答。
将450个UI控件放入什么类型的容器?一个ItemsControl或列表框?什么是虚拟化? – WiredPrairie 2010-08-17 12:22:16
由于您使用的是线程,因此您可能会遇到与您正在使用的集合有关的问题 - 如果您是从另一个线程修改集合(而另一个线程正在使用枚举器,则通过foreach)。 – WiredPrairie 2010-08-17 12:23:39