当前位置:编程学习 > C#/ASP.NET >>

C#按钮事件问题,求大神

在winfom中添加一按钮,按钮的click事件也绑定好了,按钮事件主要是与服务器交互,获得的数据放入本地对象的某个属性(自己定义的类)中
结果在测试时发现以下情况:
    几天前刚开始程序运行正常,点击按钮能正常实现功能,过了一段时间(2个小时左右),发现点击该按钮,无响应,然后在程序中打断点,发现该按钮事件根本进不去(其他按钮功能一切正常),没调用按钮事件,重新编译程序再进去,发现按钮又可以使用了,以为就ok了,又测试了几天一切正常,
    但是今天进行测试,又发现了这个问题,该怎么破啊,求大神指点一下,是什么原因,
    PS:程序中还有一后台线程定时操作本地对象
    今天自己想了想,会不会是两个操作冲突了,产生异常,
    (1)把本地对象损坏,导致后续操作本地对象属性无法指向其他内存
    (2)把这个按钮的click事件给移除了
     有没有这两种可能性?
     由于这个现象没什么规律性,浮现现象完全靠运气,今天试了一天了也没浮现出来,快崩溃了,遇到过类似的问题的同胞们,还有各种膜拜的大神,赶快来指点一下,求救啊 c# 对象 按钮 内存 服务器 --------------------编程问答-------------------- 你最好贴出代码。说的云里雾里的。 --------------------编程问答-------------------- 现在手边没代码,伪代码如下:
LocalList类的公共属性
public static List1 l1 = new List1();//List1 已经定义好的类
按钮事件:
private void button1_Click(object sender, EventArgs e)
{
     LocalList.l1 = server.getList1(参数1,参数2); //服务器方法 是可以正常返回的  
}
后台线程3分钟一次:
LocalList.l1 = server.getList1(参数1,参数2); 

基本上就这些,现在是开始可以成功调用按钮事件,运行一段时间后就不能调用了
重新编译程序又可以调用了,但是过一段时间(几天随机出现),就又不能用了。
现象随机出现,另外测试过程中,程序是一直在运行的
--------------------编程问答-------------------- UI线程和后台线程有没有共享资源,存不在在线程同步的问题? --------------------编程问答--------------------
引用 2 楼 qingyu2161 的回复:
现在手边没代码,伪代码如下:
LocalList类的公共属性
public static List1 l1 = new List1();//List1 已经定义好的类
按钮事件:
private void button1_Click(object sender, EventArgs e)
{
     LocalList.l1 = server.getList1(参数1,参数2); //服务器方法 是可以正常返回的  
}
后台线程3分钟一次:
LocalList.l1 = server.getList1(参数1,参数2); 

基本上就这些,现在是开始可以成功调用按钮事件,运行一段时间后就不能调用了
重新编译程序又可以调用了,但是过一段时间(几天随机出现),就又不能用了。
现象随机出现,另外测试过程中,程序是一直在运行的



所有的信息中我关注点"后台纯种3分钟一次",这个运行起什么作用?为何定义3分钟运行一次?
是否应该考虑用缓存比每三分钟运行一次好的呢?
--------------------编程问答-------------------- 按照你得说法,点击button就没有触发click事件,个人觉得跟线程有关。程序的server和线程的server分开,在click事件里新定义一个server对象,还有就是线程里有没有操作控件,如果操作了控件,在一定程度上会造成窗体控件丢失句柄,总之,慢慢排除 --------------------编程问答-------------------- 忘了说了,后台线程相当于从服务器中取数据,每3分钟更新下本地的数据,而这个按钮调用的方法和后台线程是一样的,相当于立刻更新本地数据的按钮,后天线程中没有操作控件的 --------------------编程问答--------------------
引用 3 楼 MicrosoftCenterOfHN 的回复:
UI线程和后台线程有没有共享资源,存不在在线程同步的问题?

这两边的操作除了调用同一个服务器方法,处理同一个本地对象外,没有其他资源共享,这两个方法中的其他对象都是各自新new出来的,但这两个方法没做冲突的处理 --------------------编程问答--------------------
引用 4 楼 hdhai9451 的回复:
Quote: 引用 2 楼 qingyu2161 的回复:

现在手边没代码,伪代码如下:
LocalList类的公共属性
public static List1 l1 = new List1();//List1 已经定义好的类
按钮事件:
private void button1_Click(object sender, EventArgs e)
{
     LocalList.l1 = server.getList1(参数1,参数2); //服务器方法 是可以正常返回的  
}
后台线程3分钟一次:
LocalList.l1 = server.getList1(参数1,参数2); 

基本上就这些,现在是开始可以成功调用按钮事件,运行一段时间后就不能调用了
重新编译程序又可以调用了,但是过一段时间(几天随机出现),就又不能用了。
现象随机出现,另外测试过程中,程序是一直在运行的



所有的信息中我关注点"后台纯种3分钟一次",这个运行起什么作用?为何定义3分钟运行一次?
是否应该考虑用缓存比每三分钟运行一次好的呢?

后台相当于更新本地数据,每三分钟一更新
按钮相当于立即更新本地数据 --------------------编程问答--------------------
引用 2 楼 qingyu2161 的回复:
现在手边没代码,伪代码如下:
LocalList类的公共属性
public static List1 l1 = new List1();//List1 已经定义好的类
按钮事件:
private void button1_Click(object sender, EventArgs e)
{
     LocalList.l1 = server.getList1(参数1,参数2); //服务器方法 是可以正常返回的  
}
后台线程3分钟一次:
LocalList.l1 = server.getList1(参数1,参数2); 

基本上就这些,现在是开始可以成功调用按钮事件,运行一段时间后就不能调用了
重新编译程序又可以调用了,但是过一段时间(几天随机出现),就又不能用了。
现象随机出现,另外测试过程中,程序是一直在运行的


也就是说,窗口主线程和后台线程都在对LocalList.l1操作。这可能会引起冲突,建议对该操作上锁
在外面声明 static Object lockObject=new Object()
调用过程封装成函数后,上锁
private void functionxxx()
{
    lock(lockObject)
    {
        LocalList.l1 = server.getList1(参数1,参数2); 
    }
} --------------------编程问答-------------------- 你最好贴出代码。 --------------------编程问答--------------------
引用 楼主 qingyu2161 的回复:
在winfom中添加一按钮,按钮的click事件也绑定好了,按钮事件主要是与服务器交互,获得的数据放入本地对象的某个属性(自己定义的类)中
结果在测试时发现以下情况:
    几天前刚开始程序运行正常,点击按钮能正常实现功能,过了一段时间(2个小时左右),发现点击该按钮,无响应,然后在程序中打断点,发现该按钮事件根本进不去(其他按钮功能一切正常),没调用按钮事件,重新编译程序再进去,发现按钮又可以使用了,以为就ok了,又测试了几天一切正常,
    但是今天进行测试,又发现了这个问题,该怎么破啊,求大神指点一下,是什么原因,
    PS:程序中还有一后台线程定时操作本地对象
    今天自己想了想,会不会是两个操作冲突了,产生异常,
    (1)把本地对象损坏,导致后续操作本地对象属性无法指向其他内存
    (2)把这个按钮的click事件给移除了
     有没有这两种可能性?
     由于这个现象没什么规律性,浮现现象完全靠运气,今天试了一天了也没浮现出来,快崩溃了,遇到过类似的问题的同胞们,还有各种膜拜的大神,赶快来指点一下,求救啊

后台线程是新开的子线程吗?会不会是两个线程同时操作一个静态变量导致的? --------------------编程问答--------------------
引用 7 楼 qingyu2161 的回复:
Quote: 引用 3 楼 MicrosoftCenterOfHN 的回复:

UI线程和后台线程有没有共享资源,存不在在线程同步的问题?

这两边的操作除了调用同一个服务器方法,处理同一个本地对象外,没有其他资源共享,这两个方法中的其他对象都是各自新new出来的,但这两个方法没做冲突的处理


那说明服务器方法没问题,不存在线程安全的问题。

但你都是处理的同一个本地对象,你的伪代码中LocalList.l1,所以这里就可能会造成冲突。你试着把操作这个对像的代码加锁试试。

然后,测试的时候,你可以把3分钟改成几秒的时间,看看你描述的问题是不是就会很容易重现。然后再加锁后看看效果。 --------------------编程问答--------------------
引用 11 楼 ghypnus 的回复:
Quote: 引用 楼主 qingyu2161 的回复:

在winfom中添加一按钮,按钮的click事件也绑定好了,按钮事件主要是与服务器交互,获得的数据放入本地对象的某个属性(自己定义的类)中
结果在测试时发现以下情况:
    几天前刚开始程序运行正常,点击按钮能正常实现功能,过了一段时间(2个小时左右),发现点击该按钮,无响应,然后在程序中打断点,发现该按钮事件根本进不去(其他按钮功能一切正常),没调用按钮事件,重新编译程序再进去,发现按钮又可以使用了,以为就ok了,又测试了几天一切正常,
    但是今天进行测试,又发现了这个问题,该怎么破啊,求大神指点一下,是什么原因,
    PS:程序中还有一后台线程定时操作本地对象
    今天自己想了想,会不会是两个操作冲突了,产生异常,
    (1)把本地对象损坏,导致后续操作本地对象属性无法指向其他内存
    (2)把这个按钮的click事件给移除了
     有没有这两种可能性?
     由于这个现象没什么规律性,浮现现象完全靠运气,今天试了一天了也没浮现出来,快崩溃了,遇到过类似的问题的同胞们,还有各种膜拜的大神,赶快来指点一下,求救啊

后台线程是新开的子线程吗?会不会是两个线程同时操作一个静态变量导致的?

操作Locallist.l1只是让它指向了另一块内存,两者冲突会导致Locallist.l1哪都不指向吗?还有一个现象:一旦出现了按钮无反应就一直无反应了,今天将后台时间设为10s,下载了个按键精灵一直点击刷新按钮,到现在还没有浮现现象,哎,崩溃啊 --------------------编程问答--------------------
引用 13 楼 qingyu2161 的回复:
Quote: 引用 11 楼 ghypnus 的回复:

Quote: 引用 楼主 qingyu2161 的回复:

在winfom中添加一按钮,按钮的click事件也绑定好了,按钮事件主要是与服务器交互,获得的数据放入本地对象的某个属性(自己定义的类)中
结果在测试时发现以下情况:
    几天前刚开始程序运行正常,点击按钮能正常实现功能,过了一段时间(2个小时左右),发现点击该按钮,无响应,然后在程序中打断点,发现该按钮事件根本进不去(其他按钮功能一切正常),没调用按钮事件,重新编译程序再进去,发现按钮又可以使用了,以为就ok了,又测试了几天一切正常,
    但是今天进行测试,又发现了这个问题,该怎么破啊,求大神指点一下,是什么原因,
    PS:程序中还有一后台线程定时操作本地对象
    今天自己想了想,会不会是两个操作冲突了,产生异常,
    (1)把本地对象损坏,导致后续操作本地对象属性无法指向其他内存
    (2)把这个按钮的click事件给移除了
     有没有这两种可能性?
     由于这个现象没什么规律性,浮现现象完全靠运气,今天试了一天了也没浮现出来,快崩溃了,遇到过类似的问题的同胞们,还有各种膜拜的大神,赶快来指点一下,求救啊

后台线程是新开的子线程吗?会不会是两个线程同时操作一个静态变量导致的?

操作Locallist.l1只是让它指向了另一块内存,两者冲突会导致Locallist.l1哪都不指向吗?还有一个现象:一旦出现了按钮无反应就一直无反应了,今天将后台时间设为10s,下载了个按键精灵一直点击刷新按钮,到现在还没有浮现现象,哎,崩溃啊

断点按钮,看看能不能执行后台的方法 --------------------编程问答-------------------- public static的成员,如果有反复赋值的情况,还是lock一个private static object或者你用.Net封装好的线程安全的List --------------------编程问答-------------------- LZ你说的问题我也遇到了,我看到人家解决的方法是把重新建立个程序,把代码复制过去,不过对于我来说不现实,太大了,不过看到人家重建就解决了,我本来想发帖子看看别人遇到怎么解决的,我的是点击button的事件,在事件里面写了代码,但是点击,断点看了完全不跳进事件里面,不过我里面也就是跳转到别的页面,所以我就在客户端用脚本写了跳转的方法用了,不过看LZ的情况不和我的一样,不过相同的是都没进入到事件中,不知道怎么回事,坐的大神解答! --------------------编程问答-------------------- 感觉不是消息卡死,就是事件被注销了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,