多线程混淆

时间:2015-06-16 17:08:33

标签: c# wpf multithreading

为了使用户界面响应用户,我开始在我的Wpf应用程序中使用多任务处理。

然而它让我感到困惑。

我已经看到了太多的多任务处理方式,现在我完全混淆了我应该做些什么。

BackgroundWorker对我来说似乎很难看,所以我使用了Task.Factory.StartNew

我的问题是我无法将其他线程连接到主线程。

  

异常:调用线程无法访问此对象,因为另一个线程拥有它

我有

的全局变量
private static AssetDeclaration _assetDeclaration = new AssetDeclaration();

此变量在LoadFilelock语句中设置。

我写的第一个代码不起作用。 _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;

0 个答案:

没有答案