| 加入收藏| 设为首页| 联系我们

首页 站长学习 站长之家 源码下载 建站素材 书籍教程 常用工具
 您现在的位置: 动力中国 >> 网络编程 >> ASP.NET教程 >> 文章正文  
 [图文].NET里面ContextSwitchDeadlock异常
 

.NET里面ContextSwitchDeadlock异常

http://www.domcn.org  文章来源:本站原创  点击数:

  关键字:.NET里面ContextSwitchDeadlock异常

问题背景

最近在做一个反应速度测试软件,是用C#写的,刚开始是觉得是个小工具,随便做做就可以了,结果是越做越复杂,本来打算一到两个星期就可以做完的,结果是做了两个月,当然这期间还有其他事情在做的。

问题出现

软件中需要一个功能,就是随机生成一个长度为120的数字序列,要求是:

1.          每个数字都是1、2、3、4这四个数中的一个;

2.          前后两个数不能重复;

3.          每个数(1、2、3、4)各30个,一共120个。

我自己写了个算法,具体思路是这样的:循环120次,每次随机产生个数,然后判断这个数已经生成了多少次了,如果超过了30个或者跟前个数字重复,就重新随机产生。

进入调试之后,每次到循环这里,貌似都是循环到80次左右的时候就会出现ContextSwitchDeadlock异常,然而有时候又不会的。

郁闷一个星期…

问题解决

我差了很多资料,网上很多关于这个异常的都是说怎么会关闭掉,只要在VS里面,“调试”“异常”“Managed Debugging Assistant”下,将这个异常的勾去掉就不会再出现了。

出现是不出现了,但问题是程序到这里下不去了,屏蔽掉也没有用。

在MSDN里面,对这个异常的解释是:

如果在试图进行 COM 上下文转换期间检测到一个死锁,则将激活 ContextSwitchDeadlock 托管调试助手 (MDA)。

症状

最常见的症状是:从托管代码对非托管 COM 组件的调用未返回任何结果。另一个症状是内存使用量与时俱增。

原因

原因很可能是单线程单元 (STA) 线程不发送消息。STA 线程或者等待而且不发送消息,或者执行一个长时间的操作而且不允许发送消息队列。

内存使用与时俱增的原因是:终结器线程试图对非托管 COM 组件调用 release 而该组件未返回任何结果。这会阻止终结器回收其他对象。

解决办法

遵循有关 STA 消息发送的 COM 规则。

对运行库的影响

此 MDA 对 CLR 无任何影响。它只报告有关 COM 上下文的数据。

输出

一条描述当前上下文和目标上下文的消息。

 

还查了些其他的资料,得出的结论是.NET下强制转换需要很大的性能(因为才我的程序里面,得到的数字序列还要转换为枚举类型),所以造成溢出呀什么的,以为没的救了,就放弃了,跟“客户”商量了一下,用别的办法了。但是后来又要求这个一定要实现了,就请教了一位老师,他看完我的算法后知道了是我的算法问题,具体描述一下:当我生成了119个数字之后,比如1、2、3都已经30个,这样最后一个数字只能是4了,然而如果倒数第二个数字正好也是4的话,这里就会出现死循环了。后来经过调试,发现果然是这个原因,原来不是死锁,而是死循环。哎…!惨败啊!

所以,这里得出的另一个结论是,造成ContextSwitchDeadlock异常的又一原因是死循环。简简单单的原因,MSDN解释的这么复杂(对我而言),不过也有可能是MS没有把这个写出来,也就是MSDN的解释和死循环根本没关系。

总之,希望这个对大家有所帮助吧,下面也贴一下老师帮我写另一个算法。仅供参考。


Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->          private static int[] Randomlist()
          {
             Random ro = new Random();
             int[] Resultlist = new int[120];
             int[] KeyNumber = new int[4];
             int i,j,r,s,flg;
             for(i=0;i<120;i++)
              {  
                 Resultlist[i]=0;
             }
 
             for (i = 0; i < 4; i++)
              {
                 KeyNumber[i] = 0;
             }
 
             for (i = 0; i < 30; i++)
              {
 
                 for (j = 0; j < 4; )
                  {
                     r = (int)ro.Next(4);
                     flg = 1;
                     if (j > 0)
                      {
                         for (s = j-1; s >= 0; s--)
                          {
                             if (r== (KeyNumber[s]-1))
                                 flg = 0;
                         }
                     }
                     if (flg == 1)
                      {
                         KeyNumber[j] = r + 1;
                         Resultlist[i * 4 + j] = KeyNumber[j];
                         j++;
                     }
                 }
  
             }
 
             for ( i=1;i<120;i++)
              {
                 if (Resultlist[i - 1] == Resultlist[i])
                  {
                     for(j=i+1;j<120;j++)
                         if (Resultlist[j] != Resultlist[i]) break;
                     if(j<120)
                      {
                         r = Resultlist[i];
                         Resultlist[i] = Resultlist[j];
                         Resultlist[j] = r;
                     }
 
                 }
             }
 
             for ( i = 119; i > 1; i--)
              {
                 if (Resultlist[i] == Resultlist[i - 1])
                  {
                     for ( j = i - 2; j >= 0; j--)
                         if (Resultlist[j] != Resultlist[i - 1]) break;
                     if (j >= 0)
                      {
                         r = Resultlist[i - 1];
                         Resultlist[i - 1] = Resultlist[j];
                         Resultlist[j] = r;
                     }
                 }
             }
 
             return Resultlist;
         }


.NET里面ContextSwitchDeadlock异常
  • 上一篇文章:

  • 下一篇文章:
  •  热门文章
    普通文章 电子邮件改头换面 四公司畅谈未
    普通文章 PC病毒史上最声名狼藉的八大病
    普通文章 Rails系统中的AJAX开发技术简析
    普通文章 基于ASP.NET AJAX框架实现表单
    普通文章 开发ASP.NET AJAX客户端定制行
    普通文章 用JFreeChart对JSP报表进行增强
    普通文章 SQL Server 2005上的CLR和ADO.
    普通文章 SQL Server 2005的XML支持机制
    普通文章 Firefox中标签式浏览技巧大全
    普通文章 Tomcat中的Session和Cookie大揭
     
     推荐文章
    推荐文章 把Google地图嵌入网页 就是这么
    推荐文章 迅雷搜索候选资源出错的解决
    推荐文章 轻松去除迅雷里的各种广告和资
    推荐文章 突破限制 免费领养到QQ空间五级
    推荐文章 Rational统一过程RUP贴近中小软
    推荐文章 构建自己的轻量级XML DOM分析程
    推荐文章 WPS Office 2007技巧:妙用配置
    推荐文章 Excel 2007:求余数函数实用进阶
    推荐文章 浅谈ASP.NET的Postback
    推荐文章 软件开发中项目需求管理简述
     
     相关文章
    没有相关文章
    设为首页 | 加入收藏 | 广告合作 | 联系站长 | 版权申明 |
    动力中国为网友提供免费学习资料,可用资源,如果您认为我们的相关内容侵害到了您的权利请联系管理员
    Copyright © 2006-2008 domcn.org All Rights Reserved.