Has*_*Now 1 .net c# asynchronous async-await
我有一个名为 的方法MapRateRequestAsync,它返回一个对象。
public async Task<ExternalRateRequest> MapRateRequestAsync(Request request, string currency, List<string> something)
{
ExternalRateRequest req = new ExternalRateRequest();
original_wt_unit = null;
if (req.shipment == null)
req.shipment = new ExternalRateShipment();
if (request.@return != null)
{
if (req.shipment.Return == null)
req.shipment.Return = new Address();
req.shipment.Return.Attn = request.@return.name;
req.shipment.Return.Company = request.@return.company;
req.shipment.Return.AddressLine1 = request.@return.address_line1;
req.shipment.Return.AddressLine2 = request.@return.address_line2;
req.shipment.Return.AddressLine3 = request.@return.address_line3;
req.shipment.Return.City = request.@return.city;
if (req.shipment.PackageList != null &&
req.shipment.PackageList.Count() > 0)
{
req.shipment.PackageList[0].Description = request.customs.description;
if (request.customs.customs_items != null)
{
req.shipment.PackageList[0].TradeItemList = new List<TradeItem>();
foreach (var custitems in request.customs.customs_items)
{
req.shipment.PackageList[0].TradeItemList.Add(new TradeItem
{
PricePerUnit = custitems.item_value,
Description = custitems.description,
Quantity = custitems.quantity,
Sku = custitems.sku
});
}
}
}
return await Task.FromResult(req);
}
Run Code Online (Sandbox Code Playgroud)
它在这里被调用,然后必须序列化,然后传递给进行异步 HTTP 调用的方法:
theReq = await new something().MapRateRequestAsync(req,
Currency, whatever);
Request = serializeobject(theReq);
var response = await HttpCallClass.SendApiReq("POST", Request);
Run Code Online (Sandbox Code Playgroud)
那么,我在制作MapRateRequestAsync、等待结果、然后MapRateRequestAsync在序列化之前等待有什么优势吗?
这里的问题似乎是:“MapRateRequestAsync 应该是异步的吗?”;目前,它不需要执行任何异步操作,如您正在使用的现实所示Task.FromResult。注意:您可以删除asyncandawait和just return Task.FromResult(req);,这将使您的效率更高,但可能会稍微改变异常的显示方式。
所以是的,这可以成为非异步的,并且只具有返回值而ExternalRateRequest不是Task<ExternalRateRequest>- 大概将其重命名为 MapRateRequest. 但是,这意味着您以后无法在需要时将其重构为真正的异步。如果这永远不会成为一个问题:当然,那就这样做。同样,如果您愿意稍后在需要时放弃 API:当然,就这样做。
但是,如果您认为稍后可能确实需要此方法真正实现异步,并且您不想破坏 API(例如,因为这是具有外部使用者的公共组件):那么现在就需要等待它。尽管它每次都会分配不必要的任务,但您所拥有的并不是非常低效。这并不大,但如果经常使用,您可以考虑使用返回类型 asValueTask<ExternalRateRequest>代替Task<ExternalRateRequest>, withreturn new(req);代替 using Task.FromResult。这仍然可以稍后进行简单更改,async而不会破坏 API,但是:它不需要Task<T>在同步路径中进行任何分配。
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |