我正在尝试在后台工作程序的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
控件遇到此问题。传递然后访问较少的“复杂”控件,例如Labels
或TextBlocks
,效果很好。
感谢您的每一个答案。
答案 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。)