【问题标题】:Returning or awaiting Task<T> in WCF在 WCF 中返回或等待 Task<T>
【发布时间】:2018-10-13 18:10:24
【问题描述】:

假设我有一个 WCF Websocket 服务:

[ServiceContract(CallbackContract =typeof(ICallback))]
public interface ISomeInterface
{       
    [OperationContract]
    string GiveMeString();
}

现在,在客户端,感谢 WCF,我还可以使用 GiveMeStrignAsync 方法。现在,我想创建使用这种 WCF 生成的异步方法的客户端 API。 有两种方法可以做到这一点:

public  Task<string> GiveMeStringAsync()   //method on client side
{
   Task<string> task = null;
   try
   {
      task = ServiceReference.GiveMeStringAsync();
   }
    catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
   }
   return task;       
}

那我就等待这个方法。

或者也许在这个方法中使用 await:

public async Task<string> GiveMeStringAsync()   //method on client side
{
   string s = String.Empty;
   try
   {
      s = await ServiceReference.GiveMeStringAsync();
   }
   catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
   }
   return s;       
}

我的问题:

  1. 根据我对 async/await 的正确理解,在第二个示例中,我仍需要在某处等待此方法,因此会有更多等待。更多的等待会导致性能下降?

  2. 假设我是对的,选项 1 是可行的方法。如果在我的客户端我有一些该 API 的包装器(不管为什么)。在这个包装类中,当调用包装类的方法(调用API的方法)时,我仍然应该返回(而不是等待)任务并只使用一次等待?

【问题讨论】:

    标签: c# wcf asynchronous async-await


    【解决方案1】:

    似乎您需要的是microsoft post 关于此,但我会尝试根据您的要求进行总结:

    更多的等待会降低性能吗?

    如果您只测量单个螺纹。您等待任务的全部原因是,长时间等待的任务不会阻塞您可能同时进行的其他工作。

    你怎么去await没有标记async的Task方法?您还应该考虑其他一些因素,例如:您真的希望 try/catch 在没有 await 的情况下工作吗?应该不会吧。

    简单的答案是一直等待/异步,不要忘记在适当的情况下使用CancellationTokens 和.ConfigureAwait(false);

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多