为了使用户界面响应用户,我开始在我的Wpf应用程序中使用多任务处理。
然而它让我感到困惑。
我已经看到了太多的多任务处理方式,现在我完全混淆了我应该做些什么。
BackgroundWorker
对我来说似乎很难看,所以我使用了Task.Factory.StartNew
我的问题是我无法将其他线程连接到主线程。
异常:调用线程无法访问此对象,因为另一个线程拥有它
我有
的全局变量private static AssetDeclaration _assetDeclaration = new AssetDeclaration();
此变量在LoadFile
到lock
语句中设置。
我写的第一个代码不起作用。 _assetDeclaration
仍为空。
Task.Factory.StartNew(() =>
{
Parallel.ForEach(opd.FileNames, LoadFile);//read multiple files together and set values to asset one by one using lock
});
FillTreeView();
LoadAssets();
然后我决定在线程中放入另外两个方法。
Task.Factory.StartNew(() =>
{
Parallel.ForEach(opd.FileNames, LoadFile);
Dispatcher.Invoke(FillTreeView);
LoadAssets();
});
现在_assetDeclaration值设置正确。另外两个方法也能正常工作
但后来我不能写ViewPort3D.Children.Add(_modelVisual3Ds[i]);
,因为_modelVisual3Ds
值是在另一个线程中设置的(在LoadAssets
方法中)并且不能在MainThread中使用。我也试过Dispatcher.Invoke
但是没有用。
_modelVisual3Ds
成员也是Freezable。所以我将它们冻结在线程中,但它们不能再次在Mainthread中使用。
那么有人可以解释发生了什么吗?
编辑:我添加了更多代码。来描述。代码被简化,因为我不能粘贴600行代码!
打开文件按钮:
private void MenuItem_Open(object sender, RoutedEventArgs e)
{
// here user chooses some files to open. and we start opening it!
//...
if (opd.ShowDialog() == true)
{
Task.Factory.StartNew(() =>
{
Parallel.ForEach(opd.FileNames, LoadFile);
Dispatcher.Invoke(FillTreeView);
LoadAssets();
});
}
}
全局变量:
private static readonly object LockThread = new object(); // to lock
private static AssetDeclaration _assetDeclaration = new AssetDeclaration(); // Class that holds needed files
private static List<ModelVisual3D> _modelVisual3Ds = new List<ModelVisual3D>(); // one of _modelVisual3Ds member must be added to viewport3D children
LoadAssets:
private static void LoadAssets()
{
//...
// i try to freeze each content but they remain not accessible in Main Thread
foreach (ModelVisual3D modelVisual3D in _modelVisual3Ds)
{
modelVisual3D.Content.Freeze();
}
}
稍后将模型加载到Viewport3D
ViewPort3D.Children.Add(_modelVisual3Ds[i]);// exception thrown here
&#34;使用来自错误上下文的参数访问此API。&#34;