提问者:小点点

在OnPrintPage事件内部使用System.Drawing.Graphics时,我可以使用'await'调用吗


我正在尝试使用System.Drawing.Printing.PrintDocument OnPrintPage方法打印文档页。

我需要呼叫和外部服务,以获得打印当前页面所需的测量值。当我调用API时,图形对象似乎因为多线程(?)而被锁定并在从API获取数据后尝试使用它时抛出异常。打印文档前无法获取数据。有没有办法避免这样的堵?

    protected override void OnPrintPage(PrintPageEventArgs e)
    {

        var location = await foo.CallWebAPI();

        //ERROR - Argument Exception
        var foo = e.Graphics.VisibleClipBounds.X;
    }

共1个答案

匿名用户

不,你不能那样做。

您可以通过将async添加到处理程序签名中来编译它,但是您将无法有意义地处理该事件。

async事件处理程序遇到第一个不完整的await时,执行将返回给调用方(引发事件的对象)。此时,事件源确定您已经完全处理了事件,因此它可以继续执行其他操作,包括在引发事件之前清理它分配的graphics对象。

当您最终使用graphics对象时,不仅事件源已经释放了该对象,而且事件源很可能不处于适合您的事件处理操作的状态。

只有当async事件处理程序不依赖于事件源在其事件被处理后将执行的操作时,才能使用它。