複数のスレッドにファイルを作成するスクリプトがあります。 、ドキュメントファイルが正しく保存されない
{ "Wordがこのファイルを保存したり、作成することはできませんあなたが上にファイルを保存したい ディスクがいっぱいでないことを確認します。時折、私はdocument.SaveAs()の呼び出しに次のエラーを取得します書き込み保護、または破損\ 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メソッドは、スレッドセーフではないため
チェックhttp://msdn.microsoft.com/en-us/library/c5kehkcz.aspx(http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.documentclass.saveas(v = office.11).aspx)。また、ファイルが別のプロセスによって保存または開かれている場合は、おそらくこのエラーが発生します。 –
最初に私は質問する必要があります:あなたはこのアプリを実行している間に開いているMS Wordを持っていないのですか? – ardnew
@JohnKoernerはスレッドセーフではないので、複数のスレッドで使用するべきではないということですか?私はページが何を意味するかを理解していません: "このタイプのpublic static(Visual BasicのShared)メンバはスレッドセーフです。"また、私は、一度に1つのスレッドだけが1つのファイルにアクセスしているという事実を知っています。 – sooprise