WCF ASync ...客户端丢失的异常

时间:2013-10-10 11:19:50

标签: wcf c#-4.0 task-parallel-library

我尝试学习WCF,所以我玩一个简单的WCF应用程序,From Source Stephen Cleary => async-wcf-today-and-tomorrow

以下是代码片段:

简单合同:

[DataContract]
public class CalculatorFault
{
  [DataMember]
  public string Message { get; set; }
}

[ServiceContract]
public interface ICalculator
{

  [OperationContract]
  [FaultContract(typeof(CalculatorFault))]
  Task<uint> DivideAsync(uint numerator, uint denominator);
}

简单服务实施:

public class Calculator : ICalculator
{
  public async Task<uint> DivideAsync(uint numerator, uint denominator)
  {
    try
    {
      var myTask = Task.Factory.StartNew(() => numerator / denominator);
      var result = await myTask;
      return result;
    }
    catch (DivideByZeroException)
    {
      throw new FaultException<CalculatorFault>(new CalculatorFault { Message = "Undefined result" });
    }
  }
}

来自客户的简单电话:

static class Program
{
  static async Task CallCalculator()
  {
    try
    {
      var proxy = new CalculatorClient();
      var task = proxy.DivideAsync(10, 0);
      var result = await task;
      Console.WriteLine("Result: " + result);
    }
    catch (FaultException<CalculatorFault> ex)
    {
      Console.Error.WriteLine("Error: " + ex.Detail.Message);
    }
  }

  static void Main(string[] args)
  {
    try
    {
      CallCalculator().Wait();
    }
    catch (Exception ex)
    {
      Console.Error.WriteLine(ex);
    }

    Console.ReadKey();
  }
}

它有效:当我尝试将数字除以零时,我从客户端获得了异常。

但我想做的是将WCF Call委托给其他函数,比如旧的回调函数。所以我在客户端尝试以下

async Task CallCalculator()
{
    try
    {
         var task = channel.DivideAsync(10, 0);
         task.ContinueWith(OnWorkCompleted); 
    }
   catch (FaultException<CalculatorFault> ex)
    {
        Console.Error.WriteLine("Error: " + ex.Detail.Message);
    }

}

void OnWorkCompleted(Task<uint> task)
{      
     var result = task.Result;
    Console.WriteLine("Result From Async: " + result);
}

这也有效,但是当我尝试除以零时,我没有例外,没有客户端的结果,尽管服务抛出异常。

为什么会这样?如何修复它以捕获客户端的异常?

1 个答案:

答案 0 :(得分:3)

作为一般规则,请勿在{{1​​}}代码中使用ContinueWith;你应该使用async代替。

当您调用await时,您的代码实际上是异常,但task.Result中的catch阻止无法捕获此异常。

所以,我会做这样的事情:

CallCalculator
相关问题