gpt4 book ai didi

c# - 通话被被叫方拒绝。 (来自 HRESULT : 0x80010001 (RPC_E_CALL_REJECTED)) 的异常

转载 作者:行者123 更新时间:2023-11-30 17:01:46 36 4
gpt4 key购买 nike

我有一个使用 Word.Interop 获取单个邮件合并文档的小型 C# Winforms 应用程序,复制每个部分,将该部分粘贴到它自己的文档中,然后单独保存。

Error

我一直(有时是随机地)收到错误消息:Call was rejected by callee。 (HRESULT 异常:0x80010001 (RPC_E_CALL_REJECTED))。我已经测试了下面的代码,当我使用断点时,我从未收到过这条消息。但是,如果我让它不受限制地运行,它似乎会在我的行 oNewWord.ActiveDocument.Range(0, 0).Paste(); 处出错。更奇怪的是,有时我会按预期收到异常消息,而其他时候处理似乎只是挂起,当我在 Visual Studio 中按 PAUSE 时,它显示我当前处于异常消息框行。

有人知道怎么解决吗?

代码:

public void MergeSplitAndReview()
{
try
{
// Mail Merge Template
Word.Application oWord = new Word.Application();
Word.Document oWrdDoc = new Word.Document();

// New Document Instance
Word.Application oNewWord = new Word.Application();
Word.Document oNewWrdDoc = new Word.Document();

object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;

// Documents must be visible for code to Activate()
oWord.Visible = true;
oNewWord.Visible = true;

Object oTemplatePath = docLoc;
Object oMissing = System.Reflection.Missing.Value;

// Open Mail Merge Template
oWrdDoc = oWord.Documents.Open(oTemplatePath);

// Open New Document (Empty)
// Note: I tried programmatically starting a new word document instead of opening an exisitng "blank",
// bu when the copy/paste operation occurred, formatting was way off. The blank document below was
// generated by taking a copy of the FullMailMerge.doc, clearing it out, and saving it, thus providing
// a kind of formatted "template".
string newDocument = projectDirectory + "\\NewDocument.doc";
oNewWrdDoc = oNewWord.Documents.Open(newDocument);

// Open Mail Merge Datasource
oWrdDoc.MailMerge.OpenDataSource(docSource, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);

// Execute Mail Merge (Opens Completed Mail Merge Documents Titled "Letters1")
oWrdDoc.MailMerge.Execute();

int docCnt = oWord.ActiveDocument.Sections.Count - 1;
int cnt = 0;
while (cnt != docCnt)
{
cnt++;
string newFilename = "";

// Copy Desired Section from Mail Merge
oWord.ActiveDocument.Sections[cnt].Range.Copy();
// Set focus to the New Word Doc instance
oNewWord.Activate();
// Paste copied range to New Word Doc




oNewWord.ActiveDocument.Range(0, 0).Paste(); // THIS IS THE POINT WHERE I GET THE ERROR MENTIONED WHEN NOT USING A BREAKPOINT.



foreach (ListViewItem lvI in lvData.Items)
{
if (lvI.Checked) // Get first checked lvI in lvData to use for generating filename
{
updateAddrChngHistory(lvI.SubItems[18].Text);

string fileSys = lvI.SubItems[14].Text.ToUpper();
string memNo = lvI.SubItems[0].Text;

newFilename = fileSys + "%" + memNo + "%" + "" + "%" + "" + "%" + "CORRESPONDENCE%OUTGOING - ACKNOWLEDGEMENT%" + DateTime.Now.ToString("yyyy-MM-dd-hh.mm.ss.ffffff") + ".doc";

lvI.Remove(); // Delete from listview the lvI used for newFilename
break; // Break out of foreach loop
}
}

// Save New Word Doc
oNewWord.ActiveDocument.SaveAs2(docTempDir + newFilename);
// Clear New Word Doc
oNewWord.ActiveDocument.Content.Select();
oNewWord.Selection.TypeBackspace();
}
// Hides my new word instance used to save each individual section of the full Mail Merge Doc
oNewWord.Visible = false;
// MessageBox.Show(new Form() { TopMost = true }, "Click OK when finished.");
MessageBox.Show(new Form() { TopMost = true }, "Click OK when finished.");

oNewWord.ActiveDocument.Close(doNotSaveChanges); // Close the Individual Record Document
oNewWord.Quit(); // Close Word Instance for Individual Record
oWord.ActiveDocument.Close(doNotSaveChanges); // Close the Full Mail Merge Document (Currently ALSO closes the Template document)
// oWord.Documents.Open(docTempDir + "FullMailMerge.doc");

oWord.Quit(doNotSaveChanges); // Close the Mail Merge Template
MessageBox.Show("Mail Merge Completed, Individual Documents Saved, Instances Closed.");
}
catch (Exception ex)
{
LogException(ex);
MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data);
// Close all Word processes
Process[] processes = Process.GetProcessesByName("winword");
foreach (var process in processes)
{
process.Close();
}
}
finally
{

}
}

最佳答案

作为Andrew Barber指出我的方式在处理异常时导致性能损失

the articleHans Passant 引用确实通过选项 3 提供了一种很棒的方式。

----下面会造成性能损失

忙时,需要过一段时间重试。

这个函数对重试有帮助吗

使用 lambda(委托(delegate))作为参数

用法一

var selectionLocal = selection; 
var range = RunWithOutRejected(() => selectionLocal.Range);

用法二

RunWithOutRejected(
() =>
following.Value.Range.FormattedText.HighlightColorIndex =
WdColorIndex.wdGray25);

用法 3

var nameLocal = name;
var bookmark = RunWithOutRejected(() =>
winWordControl
.GetDocument()
.Bookmarks.Add(nameLocal, range));
name = RunWithOutRejected(() => bookmark.Name);
return new KeyValuePair(name, bookmark);

ps: interop MSword 使用此函数时,代码_application.Selection.PasteSpecial(); 失败


    public static T RunWithOutRejected<T>(Func<T> func)
{
var result = default(T);
bool hasException;

do
{
try
{
result = func();
hasException = false;
}
catch (COMException e)
{
if (e.ErrorCode == -2147418111)
{
hasException = true;
}
else
{
throw;
}
}
catch (Exception)
{
throw;
}
} while (hasException);

return result;
}
}

关于c# - 通话被被叫方拒绝。 (来自 HRESULT : 0x80010001 (RPC_E_CALL_REJECTED)) 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638978/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com