C# 返回或等待任务<;T>;在WCF中

C# 返回或等待任务<;T>;在WCF中,c#,wcf,asynchronous,async-await,C#,Wcf,Asynchronous,Async Await,假设我有一个WCF Websocket服务: [ServiceContract(CallbackContract =typeof(ICallback))] public interface ISomeInterface { [OperationContract] string GiveMeString(); } 现在,在客户端,由于WCF,我还提供了MesTrignAsync方法供我使用。现在,我想创建使用此类WCF生成的异步方法的客户端API。 有两种方法可以做

假设我有一个WCF Websocket服务:

[ServiceContract(CallbackContract =typeof(ICallback))]
public interface ISomeInterface
{       
    [OperationContract]
    string GiveMeString();
}
现在,在客户端,由于WCF,我还提供了MesTrignAsync方法供我使用。现在,我想创建使用此类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;       
}
public Task GiveMeStringAsync()//客户端的方法
{
Task=null;
尝试
{
task=ServiceReference.GiveMeStringAsync();
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
返回任务;
}
那么我将等待这个方法

或者在该方法中使用wait:

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;       
}
客户端上的公共异步任务GiveMeStringAsync()//方法 { string s=string.Empty; 尝试 { s=等待ServiceReference.GiveMeStringAsync(); } 捕获(例外情况除外) { 控制台写入线(例如消息); } 返回s; } 我的问题是:

  • 正如我正确理解async/await一样,在第二个示例中,我仍然需要在某个地方等待这个方法,因此会有更多的等待。更多等待结果导致性能下降

  • 让我们说,我是对的,选择1是一条路要走。如果,在我的客户端,我有一些API的包装器(不管为什么)。在这个包装类中,当调用包装类的方法(调用API的方法)时,我仍然应该返回(而不是等待)任务并只使用一次等待


  • 似乎你需要的是关于这一点的答案,但我将根据你的提问进行总结:

    更多的等待会降低性能吗

    如果你只测量一根线-当然。等待任务的全部原因是,等待时间长的任务不会阻碍您可以同时执行的其他工作

    您将如何等待未标记为异步的任务方法?您还应该考虑其他因素,例如:您真的希望try/catch在没有等待的情况下工作吗?可能不会


    简单的答案是一直等待/async,不要忘记使用
    CancellationToken
    s,或者
    .ConfigureAwait(false)在适当的地方

    似乎您需要的是关于这一点的详细信息,但我将尝试根据您提出的问题进行总结:

    更多的等待会降低性能吗

    如果你只测量一根线-当然。等待任务的全部原因是,等待时间长的任务不会阻碍您可以同时执行的其他工作

    您将如何等待未标记为异步的任务方法?您还应该考虑其他因素,例如:您真的希望try/catch在没有等待的情况下工作吗?可能不会

    简单的答案是一直等待/async,不要忘记使用
    CancellationToken
    s,或者
    .ConfigureAwait(false)在适当的地方