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