小编Dan*_*iel的帖子

后台工作者在自己的班级处理

好吧,我有以下问题,希望你能帮助我:

我想创建一个带后台工作程序的WPF应用程序,用于更新richtextboxes和其他UI元素.这个后台工作者应该处理一些数据,例如处理文件夹的内容,做一些解析等等.因为我想在Main类之外移动尽可能多的代码,所以我创建了一个类MyProcess.cs,如下所示(事实上,到目前为止,这个类没有多大意义,如果有更多的处理元素,这个问题已经解决了).一般功能应该是:

  1. MainWindow:将创建一个字符串数组(命名this.folderContent)
  2. MainWindow:后台工作者开始将此数组作为参数
  3. MainWindow:DoWork()将调用该方法(我知道,这个现在在一个新线程中运行)
  4. MyProcess:根据给定的字符串数组生成(迄今为止未格式化的)段落
  5. MainWindow:如果后台工作程序完成,RunWorkerCompleted()则调用该方法(在UI线程中运行),该方法应通过方法的返回参数更新WPF RichTextBox

最后一步导致带有注释的InvalidOperationsException,"调用线程无法访问此对象,因为另一个线程拥有它".我读了一下后台工作者类及其功能.所以我认为它与方法中的this.formatedFilenames.Inlines.Add(new Run(...))调用Execute()有关MyProcess.如果我用字符串列表或类似的东西替换Paragraph属性(没有额外的new()调用),我可以通过get方法访问此成员而不会出现任何问题.与我发现的后台工作者相关的所有示例都只返回基本类型或简单类.

MainWindow.xaml.cs

    public MainWindow()
    {
        InitializeComponent();
        this.process = new MyProcess();
        this.worker = new BackgroundWorker();
        this.worker.DoWork += worker_DoWork;
        this.worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        this.process.Execute((string[])e.Argument);
        e.Result = this.process.Paragraph();
    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.rtbFolderContent.Document.Blocks.Clear();
        // the next line causes InvalidOperationsException:
        // The calling thread cannot access this object …
Run Code Online (Sandbox Code Playgroud)

c# wpf multithreading backgroundworker

5
推荐指数
1
解决办法
972
查看次数

标签 统计

backgroundworker ×1

c# ×1

multithreading ×1

wpf ×1