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)是無效的,當它完成有另一個端點這我雙工合同,我打。我不喜歡這個,因爲如果我的架構發生根本性的變化,並且如果字符串是緩慢的互聯網連接的大塊文本,它仍然會遭受同樣的問題?
我目前在加載事件的UI線程中創建ServiceHost權限。我應該在後臺線程中創建它? – 2011-05-31 19:45:36
阻塞行爲也在服務器中。客戶端調用後臺線程中的所有方法。 – 2011-05-31 19:46:02
@nextgenneo如果你在UI線程上創建你的'ServiceHost',是的,默認情況下它只會處理UI線程上的請求。但是,您可以在您的服務實現類上設置'[ServiceBehavior(UseSynchronizationContext = false)]',這將導致請求由線程池中的工作線程處理。有關完整的解釋,請參閱http://www.code-magazine.com/article.aspx?quickid=0701041&page=3。 – 2011-05-31 20:14:03