4

我们有一个下游系统,一个 ERP 系统,它可以通过 SOAP 公开其表。它发布的 Web 服务通常具有 Create、Update 和 Delete 方法。然后,我们使用包含异步方法的 svcutil 在我们端生成代理。最后,我们在它前面放了一个 ACL,供其他系统交互。

我们还刚刚发现了一个重要的不变量——项目的成本计算信息不能由 ERP 系统本身以外的任何东西更新。然而,真正愚蠢的 API 将允许消费者这样做。

我解决这个问题的想法是对 WCF 代理进行子类化,并具有用于更新该 throw 的显式实现NotSupportedException。不,这不会阻止开发人员生成自己的代理并执行此操作。但至少我们可以保证在通过我们的 ACL 时不会发生这种情况。

    Update_Result Item_Port.Update(Update request)
    {
        throw new NotSupportedException();
    }

对于异步方法,我可以这样做

    Task<Update_Result> Item_Port.UpdateAsync(Update request)
    {
        throw new NotSupportedException();
    }

或者

    Task<Update_Result> Item_Port.UpdateAsync(Update request)
    {
        return Task.Factory.StartNew<Update_Result>(() =>
        {
            throw new NotSupportedException();
        });
    }

从异步的角度来看,哪个更“正确”?

4

1 回答 1

5

两者会有不同的行为。

在第一种情况下,此 API 的调用者将NotSupportedException在调用此方法后立即获得。

在您的第二种情况下,呼叫者将收到一个故障Task<T>(或在拨打电话后不久将出现故障)。这将导致任务继续或获取任务的值时出现异常(通过task.Result)。

鉴于您的目标,我个人会采用第一种方法。这具有更少的开销(您没有创建任务),并且它使呼叫站点立即明显地发现有问题。虽然它不如编译时错误好,但在调试过程中被遗漏的可能性要小得多,因为即使以“即发即弃”的方式调用任务也会抛出它。

于 2013-04-22T23:59:26.437 回答