BackGround worker跨类的问题

时间:2014-12-23 20:06:11

标签: wpf c#-4.0

这是我在这个论坛的第一个问题,希望它不会在某个地方重复,因为我已经搜索了将近4周的响应而没有取得任何进展。

这是我的情况, 我正在开发一个需要进行大量后台操作的应用程序,因此我创建了2个BKW,第一个用于从数据库加载数据并将其放入可观察集合中,“无需报告进度或支持取消这一个':

    private Boolean loadTestSteps()
    {
        // Create a background worker thread that  don't report progress and does not
        // support cancelation
        BackgroundWorker wk_LoadTestSteps = new BackgroundWorker();

        wk_LoadTestSteps.DoWork += new DoWorkEventHandler(wk_LoadTestSteps_DoWork);

        wk_LoadTestSteps.RunWorkerAsync();

        return true;
    }

可观察的集合类:

public class clsTestStep:DependencyObject     {         public static DependencyProperty TestStepProperty = DependencyProperty.Register(         “TestStep”,typeof(String),typeof(clsTestStep));

    public string TestStep
    {
        get { return (string)GetValue(TestStepProperty); }
        set { SetValue(TestStepProperty, value); }
    } and so on for the rest of items....

现在主要的backGround应该执行更长的操作,同时向主UI报告进度,声明如此

    private void InitializeBackGroundWork()
    {
        _wk_StartTest = new BackgroundWorker();
        // Create a background worker thread that ReportsProgress &
        // SupportsCancellation
        // Hook up the appropriate events.
        _wk_StartTest.DoWork += new DoWorkEventHandler(_wk_StartTest_DoWork);
        _wk_StartTest.ProgressChanged += new ProgressChangedEventHandler
                (_wk_StartTest_ProgressChanged);
        _wk_StartTest.RunWorkerCompleted += new RunWorkerCompletedEventHandler
                (_wk_StartTest_RunWorkerCompleted);
        _wk_StartTest.WorkerReportsProgress = true;
        _wk_StartTest.WorkerSupportsCancellation = true;
        _wk_StartTest.RunWorkerAsync();
    }
在do work事件中,恰好在foreach循环中我遇到了一个错误:你无法访问这个对象,因为另一个线程拥有它:

    void _wk_StartTest_DoWork(object sender, DoWorkEventArgs e)
    {

        //Loop through each test step and perform Test 
        foreach (clsTestStep item in _testStep)
        {
            Thread.Sleep(200); 
            temp[0] = item.TestStep;
            temp[1] = item.Delay.ToString();
            temp[2] = item.NumberRepetition.ToString();
            temp[3] = item.Mode.ToString();

            //Report % of Progress, Test step Name,and the paragraph from Class PerformTest
            _wk_StartTest.ReportProgress(counter,
                temp[0]);
            counter += 1;

            _performTest.Fdispatcher(temp, out _paragraph);

            //_si.PgBarMax = Convert.ToDouble(_testStep.Count);

        }

        //Report completion on operation completed
        _wk_StartTest.ReportProgress(counter);

    }

我在这里失踪了,因为我的脑袋会从搜索中消失!!!

2 个答案:

答案 0 :(得分:0)

听起来你的ObservableCollection是由其他线程创建的,所以你的_ wk_StartTest_DoWork 方法无法访问它。

你的 _testStep 变量来自哪里?

顺便说一下,在多线程环境中,当许多线程访问相同的数据时,您应该更喜欢使用 ConcurrentBag 类而不是ObservableCollection。 ConcurrentBag是线程安全的。

答案 1 :(得分:0)

对于那些可能会遇到这种问题的人^^ finnaly我找到了一种方法来访问一个类,即使它不是由当前线程所拥有的一篇很好的文章,一步一步解释如何做到这一点here