WPF将TreeView传递给后台工作者的DoWork方法

时间:2017-10-17 19:55:04

标签: c# wpf multithreading visual-studio treeview

我正在尝试在后台工作程序的TreeView方法中访问DoWork控件的标头属性。

我尝试了以下内容:

var worker = new BackgroundWorker();
worker.DoWork += DoWork;
worker.RunWorkerAsync(MyTreeView);

private void DoWork(object sender, DoWorkEventArgs e)
{
    var x = (e.Argument as TreeView);
    var item1 = x.Items[0] as TreeViewItem;

    //error here..
    var headerItem1 = item1.Header;
}

抛出的错误表明我想访问的属性由另一个线程(在我的情况下是UI线程)拥有。

到目前为止,我只对TreeView控件遇到此问题。传递然后访问较少的“复杂”控件,例如LabelsTextBlocks,效果很好。

感谢您的每一个答案。

1 个答案:

答案 0 :(得分:0)

规则是:仅访问GUI线程上的GUI元素(控件)

test(event){ event.preventDefault(); var regex_mongoinclude = document.getElementById("regexinclude").value; var regex_mongoexclude = document.getElementById("regexexclude").value; if (this.props.item.type == "email") { (function(prop) { var text = document.getElementById("name_sub").value; var reg = /^([a-zA-Z0-9.\-_]+[@]{1}[a-zA-Z0-9\-_]+[.]{1}[a-zA-Z0-9\-_]+[,]*)+/; if(reg.test(text)==true) { Subs.update( { _id: prop.item._id }, { text, type :"email", createdAt: new Date(), regex_mongoinclude, regex_mongoexclude, topic:prop.parent._id, }, { upsert: true } ) this.setState({ showMessage: true, isError: false }); } else { this.setState({ showMessage: true, isError: true }); } })(this.props) } else if (this.props.item.type == "slack") { 中,将在后台线程上调用BackgroundWorker事件处理程序。您不能访问该线程上的GUI元素。访问意味着读取或写入属性(或索引器)或调用方法。

如果您需要对后台线程的控件执行某些操作,请使用DoWork方法。但请注意,使用Dispatcher.Invoke / Invoke方法可能会影响整体效果(例如,在紧密循环中使用时)。

您必须以不需要访问后台线程上的GUI元素的方式重新设计逻辑。这将是最好的解决方案。

顺便说一句,我建议您从BeginInvoke转到现代异步模式(BackgroundWorker / async& await s。)