如果一个方法只有赋值,那么等待该方法是否有意义?

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在序列化之前等待有什么优势吗?

Mar*_*ell 5

这里的问题似乎是:“MapRateRequestAsync 应该是异步的吗?”;目前,它不需要执行任何异步操作,如您正在使用的现实所示Task.FromResult。注意:您可以删除asyncandawaitjust return Task.FromResult(req);,这将使您的效率更高,但可能会稍微改变异常的显示方式。

所以是的,这可以成为非异步的,并且只具有返回值而ExternalRateRequest不是Task<ExternalRateRequest>- 大概将其重命名为 MapRateRequest. 但是,这意味着您以后无法在需要时将其重构真正的异步。如果这永远不会成为一个问题:当然,那就这样做。同样,如果您愿意稍后在需要时放弃 API:当然,就这样做。

但是,如果您认为稍后可能确实需要此方法真正实现异步,并且您不想破坏 API(例如,因为这是具有外部使用者的公共组件):那么现在就需要等待它。尽管它每次都会分配不必要的任务,但您所拥有的并不是非常低效。这并不大,但如果经常使用,您可以考虑使用返回类型 asValueTask<ExternalRateRequest>代替Task<ExternalRateRequest>, withreturn new(req);代替 using Task.FromResult。这仍然可以稍后进行简单更改,async而不会破坏 API,但是:它不需要Task<T>在同步路径中进行任何分配。