У вас возникли проблемы с клиентскими подключениями, которые необходимо передать между потоками.Передача ClientConnections вокруг разных процессов
1.) У нас есть класс обслуживания
public class Service : ServiceBase
{
public ServiceHost serviceHost = null;
public CMLiteService()
{
ServiceName = "MyService";
}
public static void Main()
{
ServiceBase.Run(new Service());
}
protected override void OnStart(string[] args)
{
try
{
if (serviceHost != null)
{
serviceHost.Close();
}
Uri baseAddress = new Uri("net.pipe://localhost/Service");
// Step 2 Create a ServiceHost instance
serviceHost = new ServiceHost(typeof(Service), baseAddress);
// Step 3 Add a service endpoint.
serviceHost.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "Service");
serviceHost.Open();
}
catch(Exception e)
{
}
}
protected override void OnStop()
{
if (serviceHost != null)
{
serviceHost.Close();
serviceHost = null;
}
}
}
2.) у нас есть интерфейс
[ServiceContract]
public interface IService
{
[OperationContract]
string InitalizeDataStore(string uri1, string uri2);
[OperationContract]
string CheckHealth();
[OperationContract]
string CreateObject(string parameters);
}
3.) У нас есть метод, который инициализирует Наше хранилище данных
ObjectOperations objectOperations;
public InitalizeDataStore (string uri1, string uri2)
{
Admin admin = new Admin(uri1, uri2);
objectOperations = new ObjectOperations(admin.client1, admin.client2);
}
4.) Вот класс администратора, который выполняет фактическое подключение к базе данных, причем оба клиента являются потокобезопасными и поддерживают m ultithreading
StorageClient1 client1
StorageClient2 client2
string URI1;
string URI2;
public AdminServices(string uri1, string uri2)
{
URI1 = uri1;
URI2 = uri2;
InitializeClient1();
InitializeClient2();
}
public StorageClient1 InitializeClient1()
{
try
{
client1 = new Client(new Uri(URI1));
client1.Connect();
return client1;
}
catch (Exception e)
{
throw e;
}
}
public Client2 InitializeClient2()
{
try
{
client2 = new Client(new Uri(URI2));
client2.Connect();
return client2;
}
catch (Exception e)
{
throw e;
}
}
5.) Когда мы начинаем службу и запустить метод инициализации он подключается и работает. Но когда мы запускаем другой процесс, клиентские соединения равны нулю? Если мы запускаем код сверху вниз в одном консольном приложении, он работает, но мы нуждаемся в запуске инициализации один раз, а затем клиентское соединение должно быть установлено для будущих процессов.
Итак, процесс 1:
IService pipeProxy = pipeFactory.CreateChannel();
pipeProxy.InitalizeDataStore(); //Returns "Connected"
Process 2:
IService pipeProxy = pipeFactory.CreateChannel();
pipeProxy.CheckHealth(); //returns null
Как мы страхуем, что детали подключения клиента также сделаны воевавших в другом процессе. Я тоже очень новичок, поэтому я не слишком много думал о многопоточности.
Почему вы ожидаете, что эти вещи будут существовать через процессы? Как правило, процессы не обмениваются памятью. Почему бы просто не использовать отдельные потоки в одном процессе? –