在将新信息与旧信息进行比较之后,我有一个将信息提供给对象的应用程序.它就像是
set { oldval=_value; _value=value; if (some comparison logic) raiseEvent(); }
这一切都发生在后台线程中,在无限循环中,间歇性地休眠100ms.真正奇怪的部分是它第一次工作,比较逻辑变为真,事件被提升.在那之后,信息不断流动,它继续进入对象,我知道这是因为我设置MessageBoxes一直显示旧值和新值,但它好像它以某种方式绕过了set子句!我在子句的开头设置了一个消息框,它只是没有弹出!这真的很奇怪,因为我确信该值不断更新.
有什么想法吗?
是的,我知道,但不幸的是,我可以展示更多...让我尝试再次解释整体结构:我有一个单独的后台线程运行无限循环.此循环不断从Data对象中提取数据,该对象由另一组线程更新.所有这些当然与Monitor.Enter和Exit同步.然后,从Data对象中提取的数据被输入到Comparer对象中.
while(true) { Thread.Sleep(100); Monitor.Enter(Data); Comparer.Value = Data.Value; Monitor.Exit(Data); }
Comparer.Value是我在第一篇文章中提到的属性.因为我在循环结束时设置了一个MessageBox,所以非常奇怪:
MessageBox.Show(Comparer.Value + " - " + Data.Value);
并且值DO实际更新,它只是在某种程度上似乎绕过了set子句,这是不可能的......这真的很奇怪.
而Rob,循环不进行任何检查,它只是将信息流模拟成Comparer.Value; 它的set子句包含比较逻辑.
bh213,我很漂亮,但我无法分辨,因为比较在任何有意义的检查完成之前就停止了.
好吧,我已经解决了这个问题,显然我的问题是错的,问题出在其他地方.感谢所有帮助,问题可能会被关闭.
没有一些有意义的代码,我们只能猜测.特别是,如果没有出现将MessageBox添加到Set的开头,那么很可能问题出在调用代码上(而不是这个).
但是有些想法 - 特别是因为你有多个线程:
某处有线程竞赛吗?一些代码应该同步吗?
工人得到了非易失性价值的陈旧副本?
线程亲和力:是什么涉及工人和UI borking事情?
你确定你有正确的实例(也就是说,触发事件的对象可能与你正在侦听的对象不同)?
它们可能都不是; 没有一些示例代码,我们无法提供帮助.
我用粗体标记了线程关联,因为如果你的工作者正在进行UI(正在通过事件)进行的更改,这是一个非常可能的问题; UI事件处理程序必须切换到UI线程以更新UI:
void SomeHandler(object sender, EventArgs args) { this.Invoke((MethodInvoker)delegate { this.Text = "Something happened"; }); }