线程与COM
场景:
C++部分封装为COM,C#来调用。调用可能是在线程中的。
应用程序退出时,C#的部分 自动清理,某些线程可能还没有完全停掉。
COM内部的东西也在释放内存。
这个时候,稍有不慎,就会崩溃。
冲突点:
1. 多个线程重复ReleaseComObject,
2. C#某个线程还在使用,另外一个线程或者主线程去ReleaseComObject。
3. 已经进行了ReleaseComObject, c#某个线程还在使用。
最让人郁闷的地方是:
try
{
Marshal.ReleaseComObject(obj);
obj = null;
}
catch (System.ArgumentException ex)
{
Debug.Assert(false, ex.Message);
}
这个Try-Catch 是没用的,出来异常,照样死掉。
仔细排查,解决办法如下:
1. 针对多个线程重复ReleaseComObject的问题,确定“谁创建谁Release”的原则,无法确定的,留到App Exit的时候Release。
2. 资源已经Release,还在使用的问题
检查发现有个线程sleep了100个毫秒,这个赶紧改掉。App exit的时候,100ms可以干好多事情的。
另外, 不知道有没有好的办法来判断COM对象存在与否,能否安全调用。
3. 正在使用的资源,另外一个线程去Release, 遵照第一个原则来执行。
4. 线程内循环的方法,粒度尽量小,便于及时更新UI和快速刹车。
5. 线程工厂,尽可能的简单明了。复杂的代价是写的痛苦,维护的痛苦。
尝试着改了几个地方,发现还是有问题。失控的多线程遇上了COM,真的难搞。
线程与COM的更多相关文章
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- [高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java 线程
线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 记一次tomcat线程创建异常调优:unable to create new native thread
测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...
- Android线程管理之ThreadLocal理解及应用场景
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
随机推荐
- docker打开api remote接口设置
前言 本文记录docker怎么打开api remote接口设置,docker的版本更新太快了,不同的版本之间,设置可能不同,本文是针对docker13.1 1. 查看配置文件位于哪里 systemc ...
- C语言 · 乘法运算
算法提高 乘法运算 时间限制:1.0s 内存限制:512.0MB 问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有 ...
- Java并发编程 LockSupport源码分析
这个类比较简单,是一个静态类,不需要实例化直接使用,底层是通过java未开源的Unsafe直接调用底层操作系统来完成对线程的阻塞. package java.util.concurrent.locks ...
- 工具软件 PYUV打开raw图片
引自:http://blog.csdn.net/lavenderss/article/details/51495648 [pYUV]如何打开YUV/RGB图片 pYUV工具本身使用起来比较简单,但如果 ...
- Jquery调用ajax参数说明
代码中有详细注释,直接上代码. 注释掉的选项,一般用不到,直接用最基本的部分就可以了. $.ajax({ // 请求的URL url: '../Daily/Daily_Report', //HTTP ...
- sql临时表,表变量,CTE,游标使用方法
if OBJECT_ID('groups') is not null drop table groups create table groups ( groupid ), val int null ) ...
- iOS第三方支付集成
支付宝(alipay)和微信支付(Wechat Pay) 支付宝: 一.总体流程 (1)先与支付宝签约.获得商户ID(partner)和账号ID(seller)(注冊app⽤用) (2)下载对应的公钥 ...
- jQuery(三):样式操作
一.DOM操作分类 DOM Core:任何一种支持DOM的编程语言都可以使用它,例如:getElementById(). HTML-DOM:用于处理HTML文档,例如:document.forms. ...
- 数据框排序 data.frame order
# sorting examples using the mtcars datasetattach(mtcars) # sort by mpgnewdata <- mtcars[order(mp ...
- 【Python】python3.6 操作mysql
1.首先安装mysqldb 下载 mysqldb 使用命令 pip3 install mysqlclient-1.3.12-cp36-cp36m-win32.whl 下载地址: mysqlclient ...