2009-07-21 152 views
1

我在Windows服務中託管了一個WCF服務。我有控制檯應用程序,我爲其添加了WCF服務引用併爲其生成了客戶端。在windows服務中託管的WCF服務的異步調用

我可以同步調用服務,但異步調用似乎並沒有工作。如果我附加服務器進程它根本沒有打到服務。

client= new ServiceClient(); 
client.DoSomething();//Works fine 

client.DoSomethingAsync()//Doesnot work 

這是已知的問題嗎?

回答

1

的asynccall可能會在後臺的WorkerThread開始。所以可能發生的事情是,你的異步線程正在消失,因爲前臺線程已經完成它的處理。

除非你有一些邏輯,你撥打這個電話等待效應初探,或繼續在你的主線程一些其他工作後,後臺線程可以不必讓應用程序退出之前創建的時間。

這可以通過異步調用之後加入Thread.sleep代碼可以容易地測試。

client.DoSomethingAsync(); 
Thread.Sleep(1000); 

發生這種情況的一個症狀是,您的服務意外啓動/停止,並且Windows會引發錯誤。

+0

謝謝..it添加睡眠後工作 – 2009-07-22 05:01:06

+0

太棒了!很高興有幫助 – pavsaund 2009-07-24 05:05:51

0

當您生成的客戶端,你打勾的框指定「生成異步操作」?

+0

是的,我可以看到生成的代碼 – 2009-07-21 12:13:42

+0

的異步方法,使剛要完全清楚,這是已在服務本身的DoSomething的方法自動生成客戶端的DoSomethingAsync方法?您還沒有嘗試在服務中公開自己的DoSomethingAsync方法? – 2009-07-21 12:18:45

+0

yes..DoSomethingAsync方法在客戶端中爲服務中的DoSomething方法自動生成 – 2009-07-21 12:54:37

0

從代碼貼出來,我假設你沒有設置處理程序來處理來自異步方法的響應。你需要像msdn post底部的例子,你可以使用AddHanlder來處理響應。

有點像下面你做異步調用之前:

AddHandler client.DoSomethingCompleted, AddressOf DoSomethingCallback 

隨着應對outome的方法:

Private Shared Sub DoSomethingCallback(ByVal sender As Object, ByVal e As DoSomethingCompletedEventArgs) 

     'Do something with e.Result 
     MsgBox e.Result 

End Sub 
0

如果你有

client.DoSomethingAsync()//Doesnot work 
通話

然後你指定了回調完成事件的處理程序?

public event DoSomethingCompletedEventHandler DoSomethingCompleted; 

會發生什麼情況是異步調用會關閉,但它將如何將任何結果發回給您?您需要爲此提供一個處理程序方法 - 將其連接到DoSomethingCompleted事件處理程序!在這種方法中,您將獲得異步調用的結果,無論您需要做什麼,都可以使用它們。

馬克

相關問題