C# XPSDocumentWriter静默故障

C# XPSDocumentWriter静默故障,c#,wpf,printing,xpsdocument,C#,Wpf,Printing,Xpsdocument,我正在使用XpsDocumentWriterclass()——特别是使用WriteAsync(FixedDocument)方法 下面是我用来调用此WriteAsync方法的代码: PrintDocumentImageableArea area = null; var xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(ref area); var fixedDocument = GenerateDocument(); xpsDocum

我正在使用
XpsDocumentWriter
class()——特别是使用
WriteAsync(FixedDocument)
方法

下面是我用来调用此
WriteAsync
方法的代码:

PrintDocumentImageableArea area = null;
var xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(ref area);

var fixedDocument = GenerateDocument();

xpsDocumentWriter.WritingCompleted += DocumentWriterOnWritingCompleted;

try
{
    xpsDocumentWriter.WriteAsync(fixedDocument);
}
catch
{
    Console.WriteLine("Error occurred");
}

我遇到的问题是,当我打印一个文档以显示
test.pdf
,如果我在pdf查看器中打开该文件,然后再次尝试打印该文件名,它会引发一个异常(由于该文件处于打开状态)-此异常会在上面的try-catch语句中捕获

这在我的电脑和其他一些人的电脑上都很好,但我找到了两台电脑,在同样的情况下,它们不会抛出异常。我还使用以下代码检查了
WritingCompleted
事件中的错误:

private void DocumentWriterOnWritingCompleted(object sender, WritingCompletedEventArgs e)
{
    if (e.Error != null)
    {
        Console.WriteLine("Error has occurred");
    }
}
这段代码无法捕获这些机器上的任何内容

附加信息-我已经检查过了,在没有检测到错误的PC上,文档不会被覆盖,它只是无法以静默方式写入文档。
WritingCompleted
事件在所有计算机上都会触发,但在任何计算机上都没有错误

最奇怪的是,这是我临时设置的代码,用于创建
FixedDocument

public FixedDocument DocumentGenerator()
{
    FixedDocument fixedDocument = new FixedDocument();

    for (int numberOfPages = 0; numberOfPages < 50; numberOfPages++)
    {
        PageContent pageContent = new PageContent();

        FixedPage fixedPage = new FixedPage()
        {
            Width = new Size(96 * 8.5, 96 * 11).Width,
            Height = new Size(96 * 8.5, 96 * 11).Height
        };

        //Add a canvas with a TextBlock and a Rectangle as children.
        Canvas canvas = new Canvas();
        fixedPage.Children.Add(canvas);
        TextBlock textBlock = new TextBlock();
        textBlock.Text =
            string.Format("Page {0} / {1}\n\nThis Is Page {0}.",
                i + 1, 1000);
        textBlock.FontSize = 24;
        canvas.Children.Add(textBlock);
        Rectangle rect = new Rectangle();
        rect.Width = 200;
        rect.Height = 200;
        rect.Fill =
            new SolidColorBrush(Color.FromArgb(200, 20, 50, 200));
        canvas.Children.Add(rect);
        ((IAddChild)pageContent).AddChild(fixedPage);

        fixedDocument.Pages.Add(pageContent);
    }

    return fixedDocument;
}
公共固定文档文档生成器()
{
FixedDocument FixedDocument=新的FixedDocument();
对于(int numberOfPages=0;numberOfPages<50;numberOfPages++)
{
PageContent PageContent=新的PageContent();
FixedPage FixedPage=新的FixedPage()
{
宽度=新尺寸(96*8.5,96*11)。宽度,
高度=新尺寸(96*8.5,96*11)。高度
};
//添加带有文本块和矩形的画布作为子对象。
画布=新画布();
fixedPage.Children.Add(画布);
TextBlock TextBlock=新的TextBlock();
textBlock.Text=
Format(“第{0}/{1}页\n\n这是第{0}页。”,
i+11000);
textBlock.FontSize=24;
canvas.Children.Add(textBlock);
矩形rect=新矩形();
矩形宽度=200;
直线高度=200;
矩形填充=
新的SolidColorBrush(Color.FromArgb(200,20,50,200));
canvas.Children.Add(rect);
((IAddChild)页面内容).AddChild(fixedPage);
fixedDocument.Pages.Add(页面内容);
}
返回固定文档;
}
numberOfPages
为~>30时,故障电脑上不会显示错误,但当
numberOfPages
为~<20时,故障电脑上会显示错误。 这些边界的变化取决于页面上呈现的内容(因此它似乎在某种程度上取决于文档的大小/复杂性)

我想知道以前有没有人见过这样的东西?
究竟为什么
FixedDocument
中的内容会影响是否由于试图覆盖另一个程序锁定的文件而引发错误?

试图处理在
catch
中打开的文件可能不是最佳设计(虽然我承认我有这样做的程序)。你最好先确定文件是否打开,如果没有打开,允许它被覆盖

这样,您就不必依赖错误处理来确定它了。我见过这样的例子:pdf将在Edge而不是Adobe中打开,并且完全绕过任何使用中的文件异常(不好)

范例

if(IsFileOpen(myfile))
{
     xpsDocumentWriter.WriteAsync(fixedDocument);
}
else
{
     //Display error message
}

用于确定如何检查文件是否打开的参考。

尝试处理在
catch
中打开的文件可能不是最佳设计(尽管我承认我有一些程序已经这样做)。最好先确定文件是否打开,然后如果没有打开,允许覆盖它

这样,您就不必依赖错误处理来确定它了。我见过这样的例子:pdf将在Edge而不是Adobe中打开,并且完全绕过任何使用中的文件异常(不好)

范例

if(IsFileOpen(myfile))
{
     xpsDocumentWriter.WriteAsync(fixedDocument);
}
else
{
     //Display error message
}

用于确定如何检查文件是否打开的参考。

哦,很好,我从来没有想过这样做-唯一的问题是“WriteAsync”方法会打开“文件保存”对话框和“打印选择”菜单,因此在“WriteAsync”之前加上“IsFileOpen”意味着在打印选择对话框r“文件保存”对话框已打开,用户可以打开PDF(然后在“文件保存”菜单中覆盖它)-这意味着这不是一个具体的解决方案。哦,很好,我从来没有想过这样做-唯一的问题是“WriteAsync”方法打开文件保存对话框和打印选择菜单,因此在“WriteAsync”之前放一个“IsFileOpen”意味着在打印选择对话框或文件保存拨号时有机会og已打开,用户可以打开PDF(然后在“文件保存”菜单中覆盖它)-这意味着这不是一个具体的解决方案。此处提供的更多详细信息:此处提供的更多详细信息: