调用Application.Quit()方法时报"This operation cannot be performed in this event handler."错误的一种解决方法

本文介绍了在子线程中打开并播放PPTX文件时遇到的问题,即在幻灯片播放结束尝试调用Application.Quit()方法关闭PPT时,出现"This operation cannot be performed in this event handler."错误。通过分析Microsoft.Office.Interop.PowerPoint.dll的SlideShowEnd和PresentationClose事件,选择在SlideShowEnd事件中关闭PPT以避免错误。对于为何不能在事件处理器中调用Quit的方法,作者表示尚不清楚原因,并希望得到更多专家的解答。
摘要由CSDN通过智能技术生成

前几天有个同事问我一个问题,就是如何使用子线程打开PPTX文件。开始时我并没有觉得这是个什么大问题。因为我觉得这个主要的难点在于注意线程上下文的切换上。不过开始做个Demo后感觉有点困惑了,主要集中在Application.Quit()方法上。

因为需求里希望打开PPT文件进行播放幻灯片,当幻灯片结束时需要关闭PPT文件。这个需求很合理,因为我们的程序其实就是个打开幻灯片的外壳,如果幻灯片结束后PPT程序还挂在任务栏上,那直接使用PPT不就行了嘛,呵呵。

直入主题啦。使用的程序集就是Microsoft.Office.Interop.PowerPoint.dll,从MSDN的文档上找到了两个事件可以解决关闭的时机,SlideShowEnd和PresentationClose事件。

SlideShowEnd事件:一个幻灯片播放结束后发生,最后一次SlideShowNextSlide事件发生后立即发生。(Occurs after a slide show ends, immediately after the last SlideShowNextSlide event occurs.)

PresentationClose事件:任何打开的ppt关闭之前立即发生,当ppt从Presentations集合移除时发生。(Occurs immediately before any open presentation closes, as it is removed from the Presentations collection.)

从说明中选择在SlideShowEnd事件里关闭PPT文件。

var _application = new Microsoft.Office.Interop.PowerPoint.Application();
_application.SlideShowEnd += pres=>
{
    pres.Close();
    _application.Quit();
};
第一次打开一个文件并结束幻灯片时一切顺利,但是重复几次同样的操作,就会报出"Application (unknown member) : Invalid request.  This operation cannot be performed in this event handler."的COMException异常。先后进行了多次修改调用的位置(不使用子线程和使用子线程调用),但是总是运行到Quit方法时报错,从Google上也没有找到明确的答案,只是说COM对象是出于STA模式下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值