我有一種感覺,要有比我想出的更好的解決方案;這裏的問題:WPF/WCF異步服務調用和同步上下文
WPF窗體將調用一個WCF方法,它返回一個布爾值。調用本身不應該在UI線程上,並且調用的結果將需要顯示在窗體上,所以返回應該被封送回UI線程。
在這個例子中,我創建了一個「ServiceGateway」類,表單將在完成登錄操作後傳遞一個方法來執行。網關應該使用UI SynchronizationContext調用這個Login-complete委託,這是在從窗體實例化網關時傳遞的。 Login方法使用anon調用_proxy.Login。異步委託,然後提供了調用委託使用UI的SynchronizationContext(「回調」 PARAM)提供給網關(從表格)的回調:
[CallbackBehavior(UseSynchronizationContext = false)]
public class ChatServiceGateway : MessagingServiceCallback
{
private MessagingServiceClient _proxy;
private SynchronizationContext _uiSyncContext;
public ChatServiceGateway(SynchronizationContext UISyncContext)
{
_proxy = new MessagingServiceClient(new InstanceContext(this));
_proxy.Open();
_uiSyncContext = UISyncContext;
}
public void Login(String UserName, Action<bool> callback)
{
new Func<bool>(() => _proxy.Login(UserName)).BeginInvoke(delegate(IAsyncResult result)
{
bool LoginResult = ((Func<bool>)((AsyncResult)result).AsyncDelegate).EndInvoke(result);
_uiSyncContext.Send(new SendOrPostCallback(obj => callback(LoginResult)), null);
}, null);
}
的登錄方法是從表單調用響應於一個按鈕點擊事件。
這工作正常,但我有一個懷疑,我正在以錯誤的方式去登錄方法;尤其是因爲我必須對WCF服務的任何其他方法調用執行相同的操作,而且這很醜陋。
我想保持封裝在網關中的異步行爲和ui同步。在WCF端實現異步行爲會更好嗎?基本上我很感興趣,如果我可以更普遍地爲其他方法實現上面的代碼,或者如果有更好的方法在一起。
你應該可以用'基於任務'的異步API來重新創建WCF客戶端,這會很好地清除它。 – 2014-10-01 01:06:19