Я создаю сервер WCF SOAP с операцией, выполнение которой занимает некоторое время:
[ServiceContract]
public interface IMyService
{
[OperationContract]
string LongRunningOperation();
}
[ServiceBehavior(
ConcurrencyMode = ConcurrencyMode.Multiple,
UseSynchronizationContext = false,
InstanceContextMode = InstanceContextMode.Single)]
class MyService : IMyService
{
public string LongRunningOperation()
{
Thread.Sleep(20000);
return "Hey!";
}
}
class Program
{
static void Main(string[] args)
{
MyService instance = new MyService();
ServiceHost serviceHost = new ServiceHost(instance);
BasicHttpBinding binding = new BasicHttpBinding();
serviceHost.AddServiceEndpoint(typeof(IMyService), binding, "http://localhost:9080/MyService");
serviceHost.Open();
Console.WriteLine("Service running");
Thread.Sleep(10000);
serviceHost.Close();
Console.WriteLine("Service closed");
Thread.Sleep(30000);
Console.WriteLine("Exiting");
}
}
ServiceHost открывается, и через 10 секунд я закрываю его.
При вызове serviceHost.Close () все подключенные клиенты, ожидающие завершения операции LongRunningOperation , немедленно отключаются.
Есть ли ожидание закрытия ServiceHost более чистым способом? То есть я хочу отключить прослушиватели службы, а также дождаться завершения всех подключенных в данный момент клиентов (или указать максимальное время ожидания).