2016-09-14 88 views
0

我想在我的WCF服务中实现异步模式。 BeginMethod被调用,但相应的EndMethod从不被调用。调试服务器,在各处放置断点,我注意到传递给BeginMethod的回调永远不会返回。我怀疑这就是为什么EndMethod从未被调用的原因。从不调用异步WCF服务的结束方法

服务器代码的结构如下:

IAsyncResult BeginMethod([params], AsyncCallback callback, object asyncState) 
{ 
    var task = Task<MyReturnType>.Factory.StartNew(()=> 
    { 
     //Do work here 
     return value; 
    }); 

    return task.ContinueWith(r=> 
     { 
      callback(task); 
      return r; 
     }); 
} 

MyReturnType EndMethod(IAsyncResult asyncResult) 
{ 
    return ((Task<MyReturnType>)asyncResult).Result; 
} 

我在EndMethod断点从未达到,而行callback(task);永远不会返回。

+0

添加服务引用后,您用什么代码调用此端点? –

+0

嗯,我自己编写客户端代码,因为我们不想公开我们的wsdl。基本上,我创建了ClientBase 的子类以及用于覆盖'CreateChanel'方法的ChannelBase 的子类。 Channel类分别通过调用'BeginInvoke(“”,args,callback,state)和'EndInvoke(“”,,asynResult)'来实现Begin和end方法。 – Jesse

+0

调用'EndXXX'实际上是调用者的责任,你明确这么做吗? 'BeginXXX'方法将调用同步版本,但您仍然需要调用'End'来获取返回值。 –

回答

0

的问题是,回调预期的情况下IAsyncResultTask<string>实例包含已传递到BeginMethod,说实话这应该是很明显的状态对象,但我错过了它。 StarNewContinueWith的不同过载做了诀窍。发布我的解决方案,以节省一些头部抓人。

IAsyncResult BeginMethod([params], AsyncCallback callback, object asyncState) 
{ 
    var task = Task<MyReturnType>.Factory.StartNew((s)=> 
    { 
     //Do work here 
     return value; 
    }, state); 

    return task.ContinueWith((t, s)=> 
    { 
     callback(t); 
     return t.Result; 
    }); 
} 

MyReturnType EndMethod(IAsyncResult asyncResult) 
{ 
    return ((Task<MyReturnType>)asyncResult).Result; 
}