Joã*_*nça 4 .net .net-4.0 task-parallel-library
我们有一个下游系统,一个ERP系统,可以通过SOAP公开它的表.它发布的Web服务通常具有Create,Update和Delete方法.然后,我们使用包含异步方法的svcutil生成代理.最后,我们在此前面放置一个ACL,供其他系统进行交互.
我们刚刚发现了一个重要的不变量 - 除了ERP系统本身之外,任何项目的成本核算信息都无法更新.然而,真正愚蠢的API将允许消费者这样做.
我想解决这个问题的方法是继承WCF代理并使用显式实现更新抛出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();
        });
    }
从异步的角度来看,哪一个更"正确"?
两者会有不同的行为.
在第一种情况下,此API的调用者将NotSupportedException在调用此方法时立即获得.
在您的第二种情况下,呼叫者将收到故障Task<T>(或者在呼叫发生后很快就会出现故障).这将导致任务继续中的异常或获取任务的值(通过task.Result).
鉴于你的目标,我个人会采用第一种方法.这样可以节省开销(您不会创建任务),并且会使调用站点立即明显出现问题.虽然它不如编译时错误那么好,但在调试过程中这个错误的可能性要小得多,因为即使以"一次又一次忘记"的方式调用任务,它也会抛出.
| 归档时间: | 
 | 
| 查看次数: | 722 次 | 
| 最近记录: |