新手使用多线程引发的困扰

最近在写个短信服务用于后台发送短信,短信分类有好几只,考虑到发送效率遂采用多线程发送。

短信发送的接口是由供应商提供的,包含了一个示例项目。

通过修改供应商提供的示例,遇到了居然花了较长时间才解决的问题,这问题是我第一次碰到所以记录一下以备后用。

接口方法声明

 

接口方法封装类


修改前的发送窗体代码


加入多线程的发送窗体代码


启动多线程运行没几秒钟后就抛出了System.AccessViolationException,提示信息为:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
异常出现在接口封装类 _CheckNet函数中的该语句:

int r = smsDll.GetProperty(ClientID, str, ref RS);

原因查N久调试N遍,最后才确认为问题出在多线程访问资源的冲突

然后修改了接口封装类,新增了锁对象,并修改了_CheckNet函数与int Send

修改后的接口方法封装类


之后运行程序就没有抛出异常,既然是资源冲突问题,那就不定义公共对象smsWorker,而分别在两个线程里定义smsWorker。运行起来仍然抛出与之前一样的异常,无奈还是改成定义公共对象smsWorker

问题虽然解决了,但问题的核心仍然没有搞明白,线程声明内的smsWorker对象,应该独立的不会出现冲突才是。

难道被调用类的对象只能存在一个?如果大型系统中不慎定义了两个对象,排错岂不是要疯掉了。

看来还应该好好学习一下线程相关的知识。

posted on 2009-07-11 12:30  allenjsl  阅读(2413)  评论(16编辑  收藏  举报

导航