2011-05-31 34 views
6

我有一個基本的buddylist類型的應用程序,這是WCF中的pub/sub交易。我的問題是一個或兩個調用長時間運行,這阻止了整個服務器應用程序(GUI更新等)。C#WCF NetTCPBinding阻止應用程序

這裏是我的代碼:

[ServiceContract(SessionMode = SessionMode.Required, 
CallbackContract = typeof(IBuddyListContract))] 
public interface IBuddyListPubSubContract 
{ 
    [OperationContract] 
    string GetABunchOfDataZipped(String sessionId); // this can take > 20 seconds 

    .... 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, 
    ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class BuddyListPubSubContract : IBuddyListPubSubContract 
{ 
    string GetABunchOfDataZipped(String sessionId) 
    { 
     // do some calculations and data retrival 
     return result; 
    } 
} 

到目前爲止,我對如何去了解它,但有一個簡單的方法的想法?

理念1:擁有GetABunchOfDataZipped(字符串的sessionId)是無效的,當它完成有另一個端點這我雙工合同,我打。我不喜歡這個,因爲如果我的架構發生根本性的變化,並且如果字符串是緩慢的互聯網連接的大塊文本,它仍然會遭受同樣的問題?

回答

2

我的問題是一個或兩個調用長時間運行,這阻塞了整個服務器應用程序(GUI更新等)。

你不清楚你在哪裏看到阻塞行爲,但它聽起來像是在客戶端。您應該從後臺線程調用WCF服務,而不是UI線程。然後,當您處理結果時,您將無法直接與UI元素進行交互,您需要使用每個控件的Invoke方法。

+0

我目前在加載事件的UI線程中創建ServiceHost權限。我應該在後臺線程中創建它? – 2011-05-31 19:45:36

+0

阻塞行爲也在服務器中。客戶端調用後臺線程中的所有方法。 – 2011-05-31 19:46:02

+1

@nextgenneo如果你在UI線程上創建你的'ServiceHost',是的,默認情況下它只會處理UI線程上的請求。但是,您可以在您的服務實現類上設置'[ServiceBehavior(UseSynchronizationContext = false)]',這將導致請求由線程池中的工作線程處理。有關完整的解釋,請參閱http://www.code-magazine.com/article.aspx?quickid=0701041&page=3。 – 2011-05-31 20:14:03