2012-03-26 100 views
1

我們爲WPF(UI)應用程序創建了WCF RESTful服務。 UI向WCF服務發送請求,然後在BLL中調用合適的方法,然後調用DAL中的方法。所有這些層已使用IOC/DI分開。來自WCF的Ansync線程RESTful服務

現在,對於一個新功能,我們希望當一個特定類型的新對象被添加到數據庫時,它應該經過3個步驟,這將在一個單獨的線程中執行。

也就是說,如果服務向BLL發送一個請求,向數據庫中添加一個新的對象OBJ,BLL應該通過DAL將對象保存到數據庫中,然後啓動一個新線程來對對象執行一些操作阻止WCF請求。

但是,只要我們通過在BLL中啓動一個新線程來嘗試這樣做,應用程序就會崩潰。這是因爲數據庫上下文的'InRequestScope'對象已經被處置,線程無法更新數據庫。此外,WCF請求在線程完成之前不會結束,但返回值已提供且BLL方法已完成執行。

任何幫助將被重視。

回答

1

我已經想出了這種行爲的解決方案和解釋。結果是一個相當愚蠢的。

由於我從BLL創建線程(使用IsBackground = true;),父線程(由服務請求發起)正在等待此線程結束。當兩個線程結束時,響應被髮送回客戶端。而且,解決方案使用BackgroundWorker,而不是火箭科學,只是常識。

而對於處理上下文,由於對象是InRequestScope,並且請求已結束。所以每當一個Repository需要一個UnitOfWork(uow/context),它就會生成一個新的上下文,並在數據庫請求完成後立即結束。解決辦法是,創建一個uow實例,存儲在一個變量中,將其傳遞給需要使用的存儲庫,並強制所有存儲庫使用相同的uow實例,而不是爲自己創建一個新的實例。

0

這似乎更多的是客戶端問題,而不是服務方關心的問題。爲什麼不讓客戶端向WCF服務發出異步請求,因爲這會自動提供對服務的多線程訪問。

內置的System.Net.WebClient(因爲您訪問webHttpBinding或WCF Web API端點)可以異步使用。這blog post快速概述了它是如何完成的。雖然這個MSDN article似乎適用於文件I/O,但大約有四分之三下降,但有關編碼異步WebClient使用情況的詳細說明。

+0

我們更希望在服務器上運行一個進程,以便客戶端不會一直等待響應。更多的服務器端進程意味着即使客戶端關閉,它也會執行。並且還會減少服務器上的流量。 – 2012-03-26 19:53:19