2

我有 WCF 服务来处理从 rdlc 文件呈现报告的请求。

我的问题:用户打印报表,然后在处理过程中,用户按 F5 刷新。

结果,我们有两种可能的结果:

  1. 当前一个报告的处理仍在运行时,用户重新打印报告。

  2. 用户在完成上一份报告的处理后重新打印报告。

对于上述两种情况,我如何检测哪一种适用?

4

1 回答 1

1

从根本上说,您需要一种在请求之间进行同步的方法。这最初是不可能的,因为您的任何服务实例都没有相互引用。

您可以做的是用您自己的. 这将使您能够控制服务实例的实例化方式。

然后你有几个选择

  • 让整个服务成为单身人士。您可以使用私有成员来同步状态。这种方法的缺点是您的整个服务需要是线程安全的。
  • 像现在一样有多个服务实例,但是给它们一个引用一个可用于同步的单例。

所以你的打印方法看起来像(伪):

public ReturnType PrintReport(ReportId, UserId) {
    If This.SyncObject.ReportRunning(ReportId, UserId) {
        //Whatever you want - throw an exception? Wait for running report to finish?
    }
    This.SyncObject.AddReport(ReportId, UserId)
    //Process as usual
    This.SyncObject.RemoveReport(ReportId, UserId)
}

显然,如果在打印/等期间抛出异常,您需要确保报告不会“卡在”同步对象中......

于 2013-09-23T09:15:11.937 回答