Приложение за блокиране на C# WCF NetTCPBinding

Имам основно приложение от тип buddylist, което е pub/sub сделка в WCF. Проблемът ми е, че едно или две от обажданията се изпълняват дълго и това блокира цялото сървърно приложение (актуализации на GUI и т.н.).

Ето моят код:

[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) да бъде празен, когато приключи, да има друга крайна точка, която е в моя дуплексен договор, който ударих. Не ми харесва това, сякаш е фундаментална промяна в моята архитектура и ако низът е голям блок от текст през бавна интернет връзка, той все още ще страда от същия проблем?


person Luke Belbina    schedule 31.05.2011    source източник


Отговори (1)


Проблемът ми е, че едно или две от обажданията се изпълняват дълго и това блокира цялото сървърно приложение (актуализации на GUI и т.н.).

Не сте наясно къде виждате блокиращото поведение, но изглежда, че ще е от страна на клиента. Трябва да правите обаждането си до вашата WCF услуга от фонова нишка, а не от нишката на потребителския интерфейс. След това, когато обработвате резултата, няма да можете да взаимодействате директно с елементите на потребителския си интерфейс, ще трябва да използвате Invoke метода на всяка контрола.

person Joel C    schedule 31.05.2011
comment
В момента създавам ServiceHost направо в моята нишка на потребителския интерфейс в събитието за зареждане. Вместо това трябва да го създам във фонова нишка? - person Luke Belbina; 31.05.2011
comment
Също така поведението на блокиране е в сървъра. Клиентът извиква всички методи във фонова нишка. - person Luke Belbina; 31.05.2011
comment
@nextgenneo Ако създадете своя ServiceHost в нишката на потребителския интерфейс, да, по подразбиране той ще обработва само заявки в нишката на потребителския интерфейс. Можете обаче да зададете [ServiceBehavior(UseSynchronizationContext=false)] на вашия клас за изпълнение на услугата и това ще накара заявките да бъдат обработвани от работни нишки от пула на нишките. Вижте code-magazine.com/article.aspx?quickid=0701041&page=3 за пълно обяснение. - person Joel C; 01.06.2011