我正在尝试使用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;
}
不,你不能那样做。
您可以通过将async
添加到处理程序签名中来编译它,但是您将无法有意义地处理该事件。
当async
事件处理程序遇到第一个不完整的await
时,执行将返回给调用方(引发事件的对象)。此时,事件源确定您已经完全处理了事件,因此它可以继续执行其他操作,包括在引发事件之前清理它分配的graphics
对象。
当您最终使用graphics
对象时,不仅事件源已经释放了该对象,而且事件源很可能不处于适合您的事件处理操作的状态。
只有当async
事件处理程序不依赖于事件源在其事件被处理后将执行的操作时,才能使用它。