【发布时间】:2010-08-17 08:32:33
【问题描述】:
我在使用后台工作程序创建对象模型时遇到了麻烦。
据我了解,我无法找到解决方法。
这是伪逻辑:
异步调用 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();
}
当然,从后台线程调用时,“new T()”处会出现跨线程异常 在 Silverlight 中,无法同步调用 Dispatcher.Invoke。
虽然我以这种方式创建了大约 450 个对象,但我希望将对象模型的创建保持在后台,而不会降低使用 Thread.Sleep 或其他“出色”方法的性能。
感谢您的回答。
【问题讨论】:
-
将 450 个 UI 控件放入什么类型的容器中? ItemsControl 还是 ListBox?虚拟化的东西?
-
由于您使用的是线程,因此您可能会遇到正在使用的集合的问题 - 如果您正在从另一个线程修改集合(而另一个线程正在使用枚举器,通过foreach)。
标签: c# silverlight thread-safety backgroundworker new-operator