我有一个使用MSWord自动化编辑某些文档的应用程序,保存并关闭后我需要抓取修改后的文件并将其放回存储库,只有一种情况我不能让它工作,那就是 当用户对文件进行更改时,选择关闭单词并选择是以保存文件
我正在使用2个事件: DocumentBeforeSave 退出
在Quit事件上我正在尝试从磁盘加载.docx文件但是在这个特殊情况下我得到一个IOException,因为该文件仍在使用中,不知怎的,我需要等到Quit事件处理完毕后,当Word实际关闭且文件不再使用时
现在我正在使用此
word.Visible = true; while (!wordDone) { //gets changed to true on the Quit event System.Threading.Thread.Sleep(100); } bool error = false; do { try { //need to load the contents of the modified file ls.Content = System.IO.File.ReadAllBytes(provider.GetFileName()); error = false; } catch (System.IO.IOException) { error = true; System.Threading.Thread.Sleep(200); } } while (error);
虽然这很有效,但我需要一种方法来处理Quit事件后触发事件,或者在word仍在运行时阻止当前线程,或者在文档保存后获取事件,底线是我需要一个干净的方式来加载文件后保存和关闭单词。 DocumentAfterSave会很棒,但似乎不存在。
我也尝试解除Quit处理程序并在Quit处理程序上调用word.Quit,这没什么区别
我也正在调查ManualResetEvent或相关类的使用,到目前为止它几乎可以正常工作,但我仍然需要在发出信号后暂停,以确保word被关闭且文件不再使用
答案 0 :(得分:2)
我过去也遇到过类似的问题。我不认为有任何干净的方式,但不是像上面那样做,如何考虑这个(如果你有一个受控的环境将适合)
答案 1 :(得分:1)
我曾经遇到过同样的问题。在所有与COM相关的对象上使用ReleaseComObject就可以了(即在Word文档对象和Word.Application对象上)。这样,您可以确保在销毁COM对象后删除所有脏锁。使用Interop API关闭文档和应用程序。我用:
var localWordapp = new Word.Application();
localWordapp.Visible = false;
Word.Document doc = null;
// ...
if (doc != null)
{
doc.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
}
localWordapp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(localWordapp);