Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用线程无法访问此对象_C#_Wpf_Multithreading_Accessibility - Fatal编程技术网

C# 调用线程无法访问此对象

C# 调用线程无法访问此对象,c#,wpf,multithreading,accessibility,C#,Wpf,Multithreading,Accessibility,此代码“var results..”引发异常“调用线程无法访问此对象,因为其他线程拥有它”。LINQ查询还不错 请问我做错了什么 DataClassesDataContext db = new DataClassesDataContext(); bool doStg() { try { var results = from t in db.table select t;

此代码“var results..”引发异常“调用线程无法访问此对象,因为其他线程拥有它”。LINQ查询还不错

请问我做错了什么

DataClassesDataContext db = new DataClassesDataContext();

    bool doStg()
    {
        try 
        {
            var results = from t in db.table
                          select t;

            //doing some things..

            return true;
        }
        catch (Exception Exception)
        {
            MessageBox.Show(Exception.Message);
            return false;
        }
    }

    bool stepByStep() 
    {
        Dispatcher.BeginInvoke(new Action(() => info.Text = "Step 1"), null);
        if (!doStg()) { return false; }
        Dispatcher.BeginInvoke(new Action(() => progressBar.Value = 33), null);

        Dispatcher.BeginInvoke(new Action(() => info.Text = "Step 2"), null);
        if (!doStg()) { return false; }
        Dispatcher.BeginInvoke(new Action(() => progressBar.Value = 66), null);

        Dispatcher.BeginInvoke(new Action(() => info.Text = "Step 3"), null);
        if (!doStg()) { return false; }
        Dispatcher.BeginInvoke(new Action(() => progressBar.Value = 100), null);

        return true;
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();

        worker.DoWork += delegate(object s, DoWorkEventArgs args)
        {
            args.Result = stepByStep(); 
        };

        worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
        {
            object result = args.Result;
            if ((bool)result) { MessageBox.Show("Done"); }
            else { MessageBox.Show("Processing stopped."); }
        };

        worker.RunWorkerAsync();
    }
编辑:

异常源:“System.Data.Linq”


TargetSite:{System.Data.Linq.SqlClient.SqlNode VisitIntivation(System.Linq.Expressions.InvocationExpression)}

移动以下代码行:

DataClassesDataContext db = new DataClassesDataContext(); 
然后将
db
作为参数传递给
doStg()
方法

    bool doStg(DataClassesDataContext db)
    {
        try 
        {
            var results = from t in db.table
                          select t;

            //doing some things..

            return true;
        }
        catch (Exception Exception)
        {
            MessageBox.Show(Exception.Message);
            return false;
        }
    }

    bool stepByStep() 
    {
        DataClassesDataContext db = new DataClassesDataContext(); 

        Dispatcher.BeginInvoke(new Action(() => info.Text = "Step 1"), null);
        if (!doStg(db)) { return false; }
        Dispatcher.BeginInvoke(new Action(() => progressBar.Value = 33), null);

        Dispatcher.BeginInvoke(new Action(() => info.Text = "Step 2"), null);
        if (!doStg(db)) { return false; }
        Dispatcher.BeginInvoke(new Action(() => progressBar.Value = 66), null);

        Dispatcher.BeginInvoke(new Action(() => info.Text = "Step 3"), null);
        if (!doStg(db)) { return false; }
        Dispatcher.BeginInvoke(new Action(() => progressBar.Value = 100), null);

        return true;
    }

为什么你把大部分的
doStg
注释掉了?@Chaos:因为它不相关。完全的例外是什么?另外,您注释掉的位实际上是在linq查询上迭代的,它看起来是什么样子?@Robert-很明显,异常与linq查询无关,因此方法中一定有其他内容。我的WPF有点弱。你是说非ui元素不受跨线程操作的影响吗?@Chaos:问题是,在原始代码中,
DataContext
在单独的线程上运行。是
BackgroundWorker
导致了这种情况,而不是WPF。我不确定底层机制是什么,但我几乎可以肯定,将
DataContext
与Linq查询放在同一个线程上可以解决问题。@Chaos:如果您的DataClassesDataContext继承自DispatcherObject(例如,如果它是DependencyObject),它将具有线程亲缘关系。因为我们不知道这个类是什么样子,所以这是一个很好的假设。@Abe:
DataClassesDataContext
很可能是Linq到SQL数据上下文,或者是实体框架数据上下文。我不知道线程关联在这些对象上是如何工作的,但它是唯一运行在
BackgroundWorker
线程之外的东西。@Robert Harvey:完全一样。它在同一行上显示相同的异常:(