c#多线程修改全局变量

来源:互联网 发布:网络大电影计划书 编辑:程序博客网 时间:2024/05/16 17:35

问题:

C#中,在多个Form的Load事件中对一个全局变量修改,有什么好建议?

我的程序有一个MainForm,一个ChildForm

MainForm是主界面,程序运行之后根据情况弹出多个ChildForm,在ChildForm的load事件中,我需要对一个全局变量(字符串)修改,应该怎么做?

问题:
1、这个全局变量应该声明在什么地方?如果声明在ChildForm里面的话,在MainForm里面就访问不到。。。
2、有可能是多个ChildForm同时弹出,在这种情况下,就会出现多个程序同时修改同一个变量的问题,如何避免冲突?会出错吗?


答复:

也是一个普遍问题,很多时候都会碰到。

c#里没有了c之中的全局变量的概念,所有的变量都得放在某一个类里面(其实变量自己也是类),因此全局变量得放在一个大家都能访问到的类之中。

有几种实现方式,一种就是放到MainForm,因为每个childform都知道老爸是谁(this.parent,可以加类型强转成MainForm的强类型),让老爸来管理这些变量没有任何不妥。具体操作就很简单了,如写成属性,读写的时候加上互斥(一个 lock 搞定)。

再就是静态变量(或者静态类),由于静态的东西只有一份,可以认为是全局的,同样要加上锁。
比如
public static class MyName
{
  private static object lockme = new object();  // 让lock用,不用管是什么东西
  private static string m_name = "";
  public static string Name
  {
    get
    {
      return m_name;  // 返回一般不需要锁,.net可以保证操作的原子性
    }
    set
    {
      lock(lockme)
      {
        m_name = value;
      }
    }
  }
}
之后在任何要用的地方就直接 MyName.Name = "";
注意包含了MyName 所在的namespace就行了。

其他还有一些,比如托管什么的,似乎有点大材小用。


另外,web程序的话,有一个Application 的全局域,可以来放全局变量,不过需要更特殊一些的处理。

参考:https://social.msdn.microsoft.com/Forums/expression/zh-CN/d0837bec-6c96-4eac-964d-333f42c6f728/cformload?prof=required

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 快递不能改地址怎么办 超市买到假货怎么办 天猫不小心删除了怎么办 生活费都没了怎么办 天猫超市发错货怎么办 双11退货红包怎么办 充电线不在充电怎么办 淘宝直播不清晰怎么办 手机扫码不清楚怎么办 安卓软件删不掉怎么办 顾客恶意差评怎么办 淘宝不能看视频怎么办 天猫精灵打不开怎么办 手机淘宝卡死了怎么办 为什么电视盒子打不开怎么办 天猫买了降价了怎么办 试用报告未提交怎么办 试用中心拉黑怎么办 淘宝赠品破了怎么办 淘宝卖家不给赠品怎么办 淘宝赠品有瑕疵怎么办 淘宝赠品不发货怎么办 移动电视没信号怎么办 网络电视死机了怎么办 电视接收网络信号不好怎么办 tcl电视待机打不开怎么办 宽带电视看不了怎么办 电视总是闪退怎么办 电视出现系统更新怎么办 电视一直在更新怎么办 电视更新死机了怎么办 法院打电话不接怎么办 内向不敢辞职怎么办呀 生气后睡不着觉怎么办 被气得睡不着怎么办 一生气就睡不着怎么办 手机接电话声音小怎么办 发微信老公不回怎么办 欠钱没有欠条怎么办 朋友欠钱不还怎么办没欠条 个人欠销售货款怎么办