2016-09-14 67 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; 
}