首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >silverlight项目中for服务的异步开始/结束模式

silverlight项目中for服务的异步开始/结束模式
EN

Stack Overflow用户
提问于 2011-10-31 17:10:43
回答 1查看 870关注 0票数 1

我发现使用SlSvcUtil.exe生成的代理(或者通过添加对Web引用的引用)只支持基于事件的异步模型,从设计角度来看这是绝对不合适的(事件从最初的开始就属于二等公民)。

我将实现F#的异步构建器方法,我发现“旧风格”的开始/结束更容易推广。我注意到SlSvcUtil.exe生成Begin/End方法对,但是用私有关键字标记它们。

我头顶上的几个选择是:

  • 通过手动更新代理类来公开Begin/End方法,
  • 使用wsdl.exe,并为缺少的System.Web类创建包装器库
  • 使用其他通信协议(HttpClient,Tcp)
  • 使用第三方代理(至今还没有找到任何代理)

有什么想法吗?

假设有人用一种方法创建了一个远程服务:

代码语言:javascript
复制
public interface CompressService
{
    public byte[] Compress(byte[] inData);
}

在SlSvcUtil之后我得到:

代码语言:javascript
复制
public class CompressServiceSoapClient: ClientBase<CompressServiceSoap...
{
    private BeginOperationDelegate onBeginCompressDelegate;
    private EndOperationDelegate onEndCompressDelegate;
    public event System.EventHandler<CompressCompletedEventArgs> CompressCompleted;
    public void CompressAsync(byte[] inData, object userState);
}

事实上,我需要:

代码语言:javascript
复制
public class CompressServiceSoapClient: ClientBase<CompressServiceSoap...
{
    public IAsyncResult BeginCompress(byte[] inData, System.AsyncCallback callback, object asyncState);
    public byte[] EndCompress(IAsyncResult result);
}

答案

解决方案是使用异步方法声明契约接口,而不使用从ClientBase<>继承的生成代码。http://msdn.microsoft.com/en-us/library/dd744834(v=vs.95).aspx的文章更详细地描述了这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-31 17:22:47

您可以使用通道工厂作为端点来访问begin/end方法。

基本上,只需创建一个新的ChannelFactory并传入绑定和端点。您可以使用主机源动态更新端点,这样就不是硬编码了。生成的实例将为您公开begin/end方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7957081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档