给定这个界面
[ServiceContract]
public interface IProductService
{
[OperationContract]
Product Get(int id);
}
我想手动(即不使用 scvutil 或在 VS 中添加服务引用)创建客户端代理。
我是按照下面的方式来做的
public class ProductService: IProductService
{
readonly ChannelFactory<IProductService> factory;
public ProductService()
{
factory = new ChannelFactory<IProductService>("*");
}
public Product Get(int id)
{
var channel = factory.CreateChannel();
return channel.Get(id);
}
}
我的问题是我也想要这个方法的异步/等待版本,只在客户端,服务器端仍然是同步的。
我希望这是一个通用解决方案,因为我有很多此类方法和服务。
最佳答案
如果您使用 ChannelFactory
为了允许异步等待,您的界面需要返回 Task
或 Task<T>
.
它会强制您的服务器端也返回一个任务,但您可以使用 Task.CompletedTask
同步执行此操作和 Task.FromResult
如果您坚持保持同步(但如果您有选择,为什么要这样做)。
例如:
[ServiceContract]
interface IProductService
{
[OperationContract]
Task<Product> GetAsync(int id);
}
class ProductService : IProductService
{
ChannelFactory<IProductService> factory;
public ProductService()
{
factory = new ChannelFactory<IProductService>("*");
}
public Task<Product> GetAsync(int id)
{
var channel = factory.CreateChannel();
return channel.GetAsync(id);
}
}
class ProductAPI : IProductService
{
public Task<Product> GetAsync(int id) => Task.FromResult(Get(id))
}
关于c# - 为手动生成的 WCF(客户端)代理实现异步/等待模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36278513/