Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пример одновременности демонстрирует использование ServiceBehaviorAttribute с ConcurrencyMode перечислением, которое определяет, обрабатывает ли экземпляр службы сообщения последовательно или одновременно. Пример основан на руководстве по началу работы, которое реализует ICalculator контракт службы. В этом примере определяется новый контракт, ICalculatorConcurrency, который наследуется от ICalculator, предоставляя две дополнительные операции для проверки состояния параллелизма службы. Изменив настройку параллельности, вы можете наблюдать за изменением поведения, запустив клиент.
В этом примере клиентом является консольное приложение (.exe), а служба хостится с помощью Internet Information Services (IIS).
Замечание
Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.
Доступны три режима параллелизма:
Single: каждый экземпляр службы обрабатывает одно сообщение за раз. Это режим параллелизма по умолчанию.Multiple: каждый экземпляр службы обрабатывает несколько сообщений одновременно. Реализация службы должна быть потокобезопасной для использования этого режима параллелизма.Reentrant: каждый экземпляр службы обрабатывает одно сообщение за раз, но принимает повторные вызовы. Служба принимает эти вызовы только когда она инициирует их. Пример демонстрирует реализацию ConcurrencyMode.Reentrant.
Использование параллелизма связано с режимом инстантирования. При PerCall инстансинге параллелизм не имеет значения, так как каждое сообщение обрабатывается новым экземпляром службы. В случае Single использования экземпляров, актуальность Single или Multiple определяется тем, обрабатывает ли один экземпляр сообщения последовательно или параллельно. При PerSession развертывании любой из режимов параллелизма может быть актуальным.
Класс службы указывает поведение параллелизма с [ServiceBehavior(ConcurrencyMode=<setting>)] атрибутом, как показано в следующем примере кода. Изменяя, какие строки закомментированы, вы можете экспериментировать с режимами параллелизма Single и Multiple. Не забудьте перестроить службу после изменения режима параллелизма.
// Single allows a single message to be processed sequentially by each service instance.
//[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]
// Multiple allows concurrent processing of multiple messages by a service instance.
// The service implementation should be thread-safe. This can be used to increase throughput.
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
// Uses Thread.Sleep to vary the execution time of each operation.
public class CalculatorService : ICalculatorConcurrency
{
int operationCount;
public double Add(double n1, double n2)
{
operationCount++;
System.Threading.Thread.Sleep(180);
return n1 + n2;
}
public double Subtract(double n1, double n2)
{
operationCount++;
System.Threading.Thread.Sleep(100);
return n1 - n2;
}
public double Multiply(double n1, double n2)
{
operationCount++;
System.Threading.Thread.Sleep(150);
return n1 * n2;
}
public double Divide(double n1, double n2)
{
operationCount++;
System.Threading.Thread.Sleep(120);
return n1 / n2;
}
public string GetConcurrencyMode()
{
// Return the ConcurrencyMode of the service.
ServiceHost host = (ServiceHost)OperationContext.Current.Host;
ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
return behavior.ConcurrencyMode.ToString();
}
public int GetOperationCount()
{
// Return the number of operations.
return operationCount;
}
}
В этом примере используется Multiple параллелизм с Single экземплярированием по умолчанию. Код клиента был изменен для использования асинхронного прокси-сервера. Это позволяет клиенту выполнять несколько вызовов к службе, не ожидая ответа между каждым вызовом. Вы можете наблюдать разницу в поведении режима параллельной работы службы.
При запуске примера запросы и ответы операции отображаются в окне консоли клиента. Отображается режим параллелизма, при котором работает служба, затем вызывается каждая операция, и отображается количество операций. Обратите внимание, что при использовании режима Multiple параллелизма результаты возвращаются в другом порядке, чем порядок их вызова, так как служба обрабатывает несколько сообщений одновременно. Изменив режим Single параллельной обработки, результаты возвращаются в том порядке, в котором они были вызваны, так как служба обрабатывает каждое сообщение последовательно. Нажмите клавишу ВВОД в окне клиента, чтобы завершить работу клиента.
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Если вы используете Svcutil.exe для создания прокси-клиента, убедитесь, что включите
/async.Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в запуска примеров Windows Communication Foundation.