2016-09-26 4 views
0

У меня есть самоидентифицированные именованные каналы (не используемые http) wcf, размещенные в библиотеке классов. Я могу начать WCF, используя следующий метод в классе библиотеки:Запуск WCF из своего собственного конструктора классов

ServiceHost serviceHost; 
public void startService() 
{ 
    // Create the service host 
    ... 
    // Open Service Host 
    serviceHost.Open(); 
} 

, а затем из тестовой программы WinForms работает следующим из кнопок мыши:

MyClassLib.MySvc testSvc; 
private void button2_Click(object sender, EventArgs e) 
{ 
    testSvc = new MyClassLib.MySvc(); 
    testSvc.startService(); 
} 

Это правильно начать WCF, запущенный в библиотеке классов.

Для этого требуется, чтобы winforms ссылались на библиотеку классов, чтобы вызвать метод startService.

Что я хочу, так это просто, чтобы запустить сервис, как только будет сделана ссылка на библиотеку классов, которая будет работать с WCF.

Я попытался добавить следующее в конструкторе библиотечного обслуживания класса:

public MySvc() 
{ 
    startService(); 
} 

И затем экземпляр из WinForms:

MyClassLib.MySvc testSvc; 
private void button2_Click(object sender, EventArgs e) 
{ 
    testSvc = new MyClassLib.MySvc(); 
    //testSvc.startService(); //No need to call this 
} 

Если я отлаживать код, я могу видеть, что в факт, что он действительно нарушает на этом этапе:

public MySvc() 
{ 
    startService(); // It does run this but service does not start 
} 

Но это не запускает сервис. Любая помощь будет оценена по достоинству.

примечание № 1: Я считаю, что его некоторые проблемы с синхронизацией, когда он не позволяет запускать службу во время метода конструктора, но не уверен в этом.

+0

У вас есть конструктор 'MySvc', но то, что в вашем коде звонит этот конструктор? (Подсказка: возможно, ничего). Вам нужна точка входа. Взгляните на свое приложение Winforms. Существует файл Program.cs со статическим методом 'Main'. Это точка входа. – helrich

+0

Конструктор - это имя класса службы в библиотеке классов. И он вызывается, когда я создаю экземпляр библиотеки классов из winforms. Он даже вызывает метод startService, но служба не запускается именно так. –

ответ

1

Проблема решена и да, мое предположение о том, что это был вопрос времени (см. Примечание № 1 выше) была верна!

Для репликации, это изменить:

public MySvc() 
{ 
    startService(); // It does run this but service does not start 
} 

Для этого и проблема решена:

public void delayStartService() 
{ 
    Task.Delay(1000).ContinueWith(t => startService()); 
} 

public MySvc() 
{ 
    delayStartService(); 
} 
+0

'Task.Delay (1000) .ContinueWith' Вы чувствуете себя правильно? Почему 1000? Почему не 10 или 10000? Будет ли это работать при каждом запуске? ... –

+0

Это заставляет меня чувствовать себя хорошо? Это заставляет вас чувствовать себя хорошо? ФУНТ. не стесняйтесь делать дальнейшие испытания для вашего собственного использования. Также не стесняйтесь публиковать лучшее решение, если вы этого желаете. –

+0

Я могу опубликовать лучшее, что не зависит от эмпирических таймингов, но не после этого ответа ... Идите вперед с вашим решением. –

Смежные вопросы