如何使用实现 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 调用 方法,它应该为子线程留出足够的时间来完成。
我有这份合同:
[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 调用 方法,它应该为子线程留出足够的时间来完成。