我使用的是通过COM互操作包装暴露第三方DLL。 然而,COM调用一个经常死机(不返回至少)。 为了尽量至少使我的代码更健壮,我异步的调用包装( _getDeviceInfoWaiter
是ManualResetEvent
)
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork +=
(sender, eventArgs) =>
{
var deviceInfo = _myCom.get_DeviceInfo(0);
_serialNumber = deviceInfo.SerialNumber;
_getDeviceInfoWaiter.Set();
};
backgroundWorker.RunWorkerAsync();
var waitFifteenSecondsForGetInfo = new TimeSpan(0, 0, 0, 15);
_getDeviceInfoWaiter.WaitOne(waitFifteenSecondsForGetInfo, true);
if(String.IsNullOrEmpty(_serialNumber))
throw new ArgumentNullException("Null or empty serial number. " +
"This is most likely due to the get_DeviceInfo(0) COM call freezing.");
然而,任何COM组件第二天通话将冻结代码。 有什么我没有想到的,或者是有一些方法来保持我的主线程不死吗?
UPDATE
基本上,这是每当一个新的设备插入到PC,使我们可以适当地将这些信息记录被称为COM调用。 然而,正如我所说, 任何 COM组件将如果一个正在等待(我们自己锁自定义COM如果第三方锁定)冻结
更新2
上面的代码不工作,并延迟UI线程的悬挂,直到下一个COM调用。 这样做的原因试图解决方法是因为var deviceInfo = _myCom.get_DeviceInfo(0);
已经锁定在UI线程。 然而,这个信息并不重要,只用于记录,所以这种方法是允许“放弃了15秒后继续前进”的情景
这里的另一个解决办法是找到一个方法来取消x秒后COM调用?