新人求助,如何监视一个变量的改变

u010390468 2016-09-28 07:46:44
先说一下我想要实现的结果:
假设有两个线程A与B,还有一个全局变量假设是k。
运行时B线程对k进行修改,而A线程负责对变量k进行监控。
现在我实现的方式是:在A线程里有一个循环,对k不停的进行判断,从而达到监控的目的,这里触发的事件都是消耗A线程的资源。
小弟经过百度,找到了可以通过使用属性来实现的监控方式,如下面这种
int k
public int kk{
set
{
k=value;
if(k>5){
//要触发的事件
}
}
get{return k;}
}
但这并不是我想要的,因为修改k的动作改成了修改kk。而修改动作是由线程B执行的,所以这里触发事件后还是会消耗B线程的资源。
所以,我想问一问大神们,有没有可以实现线程A主动去监控变量k的方式,不停的循环太消耗cpu了,这是无奈之举。
小弟在此谢过各路大神了。。。。
求方法!!!!
如果能有解决办法,100分送上了。。。。。
...全文
671 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
john_QQ:2335298917 2016-09-29
  • 打赏
  • 举报
回复
引用 7 楼 u010390468 的回复:
[quote=引用 4 楼 johnliuyuan 的回复:] int k; public delegate void kchangeHandler ( object sender, EventArgs e ); public event kchangeHandler kchangeevent; public int kk{ set { if(k!=value) { k=value; if(kchangeevent!=null) { kchangeevent(this,new EventArgs()); } } } get{return k;} }
这个不是我想要的,这个和我百度到的是一样的逻辑,间接去改k(直接改的kk),而不是直接修改k。[/quote] 你因该知道,良好的封装也是一个编程的好习惯
cheng2005 2016-09-29
  • 打赏
  • 举报
回复
引用 11 楼 u010390468 的回复:
[quote=引用 10 楼 wddw1986 的回复:] 用AutoResetEvent,B里面修改之后触发Event,A使用AutoResetEvent等待就可以了。 需要注意的是,A里面如果一次过程没处理完,B就再次出发Event,那么A就不会处理。 所以,先设计好你的逻辑才是最重要的,编程是次要的步骤。
这貌似也要有B线程的干预才可以进行,能不能实现由A线程独立去监控一个变量,一但发现这个变量有改变,A线程马上起来工作[/quote] 你的知识基础已经跟不上你那天马行空的想象了。
u010390468 2016-09-29
  • 打赏
  • 举报
回复
引用 10 楼 wddw1986 的回复:
用AutoResetEvent,B里面修改之后触发Event,A使用AutoResetEvent等待就可以了。 需要注意的是,A里面如果一次过程没处理完,B就再次出发Event,那么A就不会处理。 所以,先设计好你的逻辑才是最重要的,编程是次要的步骤。
这貌似也要有B线程的干预才可以进行,能不能实现由A线程独立去监控一个变量,一但发现这个变量有改变,A线程马上起来工作
cheng2005 2016-09-29
  • 打赏
  • 举报
回复
用AutoResetEvent,B里面修改之后触发Event,A使用AutoResetEvent等待就可以了。 需要注意的是,A里面如果一次过程没处理完,B就再次出发Event,那么A就不会处理。 所以,先设计好你的逻辑才是最重要的,编程是次要的步骤。
u010390468 2016-09-29
  • 打赏
  • 举报
回复
引用 5 楼 closurer 的回复:
不停循环很常见,只是每次循环要休眠一定的时间。
现在我就是不停的循环,每次循环间隔了100ms,但这样总感觉不够及时。。。
u010390468 2016-09-29
  • 打赏
  • 举报
回复
引用 6 楼 qq_20324803 的回复:
用事件。不要用循环检测。c#对这种情形已经考虑过了。
大神求方法!!!
u010390468 2016-09-29
  • 打赏
  • 举报
回复
引用 4 楼 johnliuyuan 的回复:
int k; public delegate void kchangeHandler ( object sender, EventArgs e ); public event kchangeHandler kchangeevent; public int kk{ set { if(k!=value) { k=value; if(kchangeevent!=null) { kchangeevent(this,new EventArgs()); } } } get{return k;} }
这个不是我想要的,这个和我百度到的是一样的逻辑,间接去改k(直接改的kk),而不是直接修改k。
摇撼大地 2016-09-29
  • 打赏
  • 举报
回复
用事件。不要用循环检测。c#对这种情形已经考虑过了。
慧眼识狗熊 2016-09-29
  • 打赏
  • 举报
回复
int _____k; public int k{ set { ... } } 这样不行么? 除非你一定要用字段不能用属性。
mwp 2016-09-29
  • 打赏
  • 举报
回复
把你这变量封成一个类,这个类有个 public event EventHandler OnDataChange; 谁想监控这个数据,谁关联这个事件
摇撼大地 2016-09-29
  • 打赏
  • 举报
回复
另外一个挺奇怪的。你很奇怪的坚持,不通过属性。来监控变量。 你这思路就很奇怪了。想要获得变量是否改变的信息。只有两种。要么循环检测。要么变化的时候触发。 你这两种方式都不要。。。。。。微软恐怕也没办法吧。
摇撼大地 2016-09-29
  • 打赏
  • 举报
回复


private static void Method(object o, MessageClass message)
        {
            Console.WriteLine(string.Format(@"Class1 对象的属性已经更改,现在的属性是:{0}",message.Message));
            Thread t = new Thread(() => Console.WriteLine(String.Format("这个是第二个线程了,也可以使用数据,{0}", message.Message)));
            t.Start();
        }
少看了,你需要第二个线程来处理变化。只需要在事件相应函数里面启动线程久ok了。
摇撼大地 2016-09-29
  • 打赏
  • 举报
回复

//调用代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static Class1 c;
        static void Main(string[] args)
        {
            c = new Class1();
            c.PropertyChanged += Method;//添加事件关注

            Thread t = new Thread(()=>Demo());
            t.Start();
            //主程序结束
            Console.ReadKey();
            
        }
        //一个线程执行这个方法。修改c的属性
        private static void Demo()
        {
            Thread.Sleep(1000);
            Console.WriteLine("thread begin");
            c.SetProperty(2);
            Console.WriteLine("thread end");
        }
        //把这个方法添加到c的事件中,触发事件的时候,执行这个方法
        private static void Method(object o, MessageClass message)
        {
            Console.WriteLine(string.Format(@"Class1 对象的属性已经更改,现在的属性是:{0}",message.Message));
        }
    }
}
//类的信息
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Class1
    {
        int _property;
        public int GetProperty()
        {
            return _property;
        }
        public void SetProperty(int value)
        {
            _property = value;
            OnPropertyChanged(new MessageClass() { ID=1,Message=value.ToString()});
        }

        protected virtual void OnPropertyChanged( MessageClass message)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, message);
            }
        }

        public event EventHandler<MessageClass> PropertyChanged;
    }

    public class MessageClass
    {
        public int ID { get; set; }
        public string Message { get; set; }
    }
}


闭包客 2016-09-28
  • 打赏
  • 举报
回复
不停循环很常见,只是每次循环要休眠一定的时间。
john_QQ:2335298917 2016-09-28
  • 打赏
  • 举报
回复
int k; public delegate void kchangeHandler ( object sender, EventArgs e ); public event kchangeHandler kchangeevent; public int kk{ set { if(k!=value) { k=value; if(kchangeevent!=null) { kchangeevent(this,new EventArgs()); } } } get{return k;} }
john_QQ:2335298917 2016-09-28
  • 打赏
  • 举报
回复
int k; public delegate void kchangeHandler ( object sender, EventArgs e ); public event kchangeHandler kchangeevent; public int kk{ set { k=value; if(kchangeevent!=null) { kchangeevent(this,new EventArgs()); } } get{return k;} }
u010390468 2016-09-28
  • 打赏
  • 举报
回复
引用 1 楼 johnliuyuan 的回复:
可以在k改变的时候触发一个事件,其他的订阅这个事件就可以了
求详细方法!!!!
john_QQ:2335298917 2016-09-28
  • 打赏
  • 举报
回复
可以在k改变的时候触发一个事件,其他的订阅这个事件就可以了

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧