在WCF中返回或等待任务<t>

时间:2018-05-03 12:14:43

标签: c# wcf asynchronous async-await

我们说我有一个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的包装器(并不重要)。在这个包装器类中,我仍然应该返回(不是等待)Task并且在调用包装类的方法(调用API方法)时只使用await一次?

1 个答案:

答案 0 :(得分:1)

看起来你需要microsoft post就此问题,但我会根据你的要求总结一下:

还有更多等待降低性能吗?

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

您如何await未标记为async的任务方法?您还应该考虑其他因素,例如:您是否真的希望try / catch在没有await的情况下工作?它可能不会。

简单的答案就是一直等待/异步,并且不要忘记在适当的地方使用CancellationToken.ConfigureAwait(false);