如何使用实现 ClientBase 接口的客户端使用异步服务?

How to consume async a service with a client that implements ClientBase interface?

我有这份合同:

[ServiceContract]
    public interface ICalculadoraService
    {
        // TODO: Add your service operations here
        [OperationContract()]
        int Add(int num1, int num2);

        [OperationContract()]
        Task<int> AddAsync(int num1, int num2);
    }

我有这个实现:

public class CalculadoraService : ICalculadoraService
    {
        public int Add(int num1, int num2)
        {
            return num1 + num2;
        }

        public async Task<int> AddAsync(int num1, int num2)
        {
            return num1 + num2;

        }
    }

在我的客户端,我有这个实现 ClientBase 接口的代理:

class WCFCalculadoraServiceProxy : ClientBase<ICalculadoraService>, ICalculadoraService
    {
        public int Add(int num1, int num2)
        {
            //Lo que hace es llamar al método del servicio.
            return base.Channel.Add(num1, num2);
        }

        public Task<int> AddAsync(int num1, int num2)
        {
            //Lo que hace es llamar al método del servicio.
            return base.Channel.AddAsync(num1, num2);
        }
    }

我的客户端中有一个使用此代理的控制台应用程序:

class Program
    {
        static void Main(string[] args)
        {
            WCFCalculadoraServiceProxy miProxy = new WCFCalculadoraServiceProxy();
            try
            {
                addAsync(miProxy);
            }
            catch
            {
                //TODO
            }
            finally
            {
                miProxy.Close();
            }
        }

        private static async void addAsync(WCFCalculadoraServiceProxy paramProxy)
        {
            int resultado = await paramProxy.AddAsync(1, 2); //is reached
            Console.WriteLine("Service is host at " + DateTime.Now.ToString()); // is not reached
            Console.WriteLine("El resultado de sumar 1 y 2 es: " + resultado);
            Console.WriteLine("Host is running... Press <Enter> key to stop");
            Console.ReadKey();
            Console.ReadLine();
        }
    }

问题是控制台没有显示结果。它到达方法 AddAsync 的第一行,但几秒钟后,控制台关闭,因此第一行的文本未显示。

我想知道如何解决这个问题,并想知道从实现 ClientBase 接口的客户端异步使用服务的正确方法是什么。

如果我添加服务引用,它会起作用,但我想知道为什么我的解决方案不起作用。

谢谢。

我认为这与 ClientBase 接口无关。

查看您的代码,await 关键字将导致方法 addAsync 中的代码在不同的子线程上执行,而主线程将继续执行其余代码。

但是,主线程没有别的事可做;下一个将要执行的语句是关闭代理,之后线程将退出。换句话说,您的程序甚至在语句 'paramProxy.AddAsync(1, 2);' 将 return 之前就已经结束,因此 Console.Writeline方法永远不会执行。

您可以尝试在 Main 中的 addAsync(miProxy) 调用之后添加一个 Thread.Sleep 调用 方法,它应该为子线程留出足够的时间来完成。