У меня есть базовое приложение типа buddylist, которое является сделкой pub/sub в WCF. Моя проблема заключается в том, что один или два вызова выполняются долго, и это блокирует все серверное приложение (обновления графического интерфейса пользователя и т. д.).
Вот мой код:
[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(String sessionId) будет недействительным, а когда он завершится, у меня будет другая конечная точка, которая находится в моем дуплексном контракте, который я нажал. Мне это не нравится, как будто это фундаментальное изменение в моей архитектуре, и если строка представляет собой большой блок текста при медленном подключении к Интернету, она по-прежнему будет страдать от той же проблемы?