当前位置:  开发笔记 > 编程语言 > 正文

非常奇怪的错误与C#中的属性

如何解决《非常奇怪的错误与C#中的属性》经验,为你挑选了1个好方法。

在将新信息与旧信息进行比较之后,我有一个将信息提供给对象的应用程序.它就像是

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,我很漂亮,但我无法分辨,因为比较在任何有意义的检查完成之前就停止了.


好吧,我已经解决了这个问题,显然我的问题是错的,问题出在其他地方.感谢所有帮助,问题可能会被关闭.



1> Marc Gravell..:

没有一些有意义的代码,我们只能猜测.特别是,如果没有出现将MessageBox添加到Set的开头,那么很可能问题出在调用代码上(而不是这个).

但是有些想法 - 特别是因为你有多个线程:

某处有线程竞赛吗?一些代码应该同步吗?

工人得到了非易失性价值的陈旧副本?

线程亲和力:是什么涉及工人和UI borking事情?

你确定你有正确的实例(也就是说,触发事件的对象可能与你正在侦听的对象不同)?

它们可能都不是; 没有一些示例代码,我们无法提供帮助.

我用粗体标记了线程关联,因为如果你的工作者正在进行UI(正在通过事件)进行的更改,这是一个非常可能的问题; UI事件处理程序必须切换到UI线程以更新UI:

void SomeHandler(object sender, EventArgs args)
{
    this.Invoke((MethodInvoker)delegate {
       this.Text = "Something happened";
    });
}

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有