文档文件获胜';保存不正确

本文关键字:保存 不正确 文件 获胜 文档 | 更新日期: 2023-09-27 18:25:21

我有一个在多个线程上创建文件的脚本。偶尔,我会在文档中出现以下错误。SaveAs()调用:

{"Word无法保存或创建此文件。请确保要保存的文件未满、写保护或已损坏。''r(C:''…''fileName.docx)"}

这让人抓狂,因为它似乎有时会发生,而不是其他时候。我花了最后一天的时间试图弄清楚,但进展甚微。我已经排除了一件事,那就是多个线程试图创建同一个文件的可能性。我确信这不会发生。我的代码中有没有遗漏的东西会导致这种情况,或者这只是处理com对象时的一个事实?我正在做的正是代码教程所说的,也许我应该放弃使用多线程?

BuildDocumentsThread(){
        var word = new Microsoft.Office.Interop.Word.Application();
        word.Options.CreateBackup = false;
        var wordQuit = (Microsoft.Office.Interop.Word._Application)word;
        foreach(var value in values){
            FormBuilder.BuildSummaryForm(word, value);
        }
        wordQuit.Quit();
}
public static void BuildSummaryForm(Application word, string value) {
        var summaryFormPath = Utilities.GetSummaryFilePath(value);
        if (File.Exists(summaryFormPath))
            File.Delete(summaryFormPath);
        object path = summaryFormPath;
        object readOnly = false;
        object o = System.Reflection.Missing.Value;
        var document = word.Documents.Add(ref o, ref o, ref o, ref o);
        document.Activate();
        Paragraph p1 = document.Content.Paragraphs.Add(ref o);
        p1.Range.Font.Name = "Arial";
        p1.Range.Font.Size = 10;
        p1.Range.Text = value;
        document.SaveAs(ref path, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o);
        document.Close();
}

文档文件获胜';保存不正确

如果SaveAs不像John Koerner在评论中描述的那样是线程安全的,则可以尝试锁定SaveAs并关闭。

在这种情况下,我不确定多线程进程将不再使用,但这是最糟糕的尝试。至少你会知道你的错误是否来自SaveAs函数。


在您的评论后添加一些信息:

添加一个类变量以创建锁定

private static object _savelock = new object();

然后在你的工人:

lock(_savelock)
{
   document.SaveAs(ref path, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o);
}
document.Close();

在这种情况下,将不会同时执行任何保存操作。锁定关闭也可能是必要的

  • 1个线程获取锁并进行保存
  • 同时,2个线程尝试进行保存,但要等到上一个线程完成保存并释放锁

在这种情况下,你真的不在乎它是否是单词的同一个实例。在这两种情况下,它都会起作用。

主要的缺点是,如果保存操作占用线程95%的时间,那么多线程几乎就没有用了,因为通过锁定保存操作,只有5%的进程是真正的多线程进程。然而,如果目标是"释放"ui并让用户在进程运行时继续工作,那么这是一个可行的解决方案。

检查http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx对于锁定价格的