IpcServiceFramework обновляет общее состояние - PullRequest
0 голосов
/ 02 апреля 2020

Использование. Net основное консольное приложение и IpcServiceFramework

В этом случае есть одно приложение, работающее в качестве диспетчера.

using System;
using System.Threading.Tasks;
using Contracts;
using JKang.IpcServiceFramework;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new IpcServiceClientBuilder<IContract>()
                     .UseNamedPipe("pipeName")
                     .Build();

        while (true)
        {
            var random = new Random().Next();
            await client.InvokeAsync(x => x.SetNumber(random));
        }
    }
}

Все, что он делает, это Я понимаю, соединяется по имени канала и начинает разбивать на этот метод SetNumber ()

Тогда у нас есть Contract.cs

public class Contract : IContract
{
    public int Number { get; set; }
    public void SetNumber(int val) => Number = val;
}

, который я хотел бы быть в качестве государства, между двумя приложениями.

И есть приложение, которое что-то делает.

static void Main(string[] args)
    {
        IServiceCollection services = new ServiceCollection();

        services.AddSingleton<IContract, Contract>();

        var serviceCollection = services.AddIpc(builder => { builder.AddNamedPipe(options => { options.ThreadCount = 2; }); });

        var buildServiceProvider = serviceCollection.BuildServiceProvider();

        new IpcServiceHostBuilder(services.BuildServiceProvider())
            .AddNamedPipeEndpoint<IContract>(name: "endpoint1", pipeName: "pipeName")
            .AddTcpEndpoint<IContract>(name: "endpoint2", ipEndpoint: IPAddress.Loopback, port: 45684)
            .Build()
            .RunAsync();

        Task.Factory.StartNew(() =>
                              {
                                  var contract = buildServiceProvider.GetService<IContract>();

                                  while (true)
                                  {
                                      Console.WriteLine(" Iam just looping... ! ==> " + contract.Number);
                                      Thread.Sleep(1500);
                                  }
                              });

        Console.ReadLine();
        Environment.Exit(-1);
    }

Как я понимаю, запускается IpcServiceHost, а затем просто печатается contract.Number через некоторое время l oop. Конечно, это всегда 0, поскольку оно никогда не обновляется.

Так что моя цель, чтобы предыдущий код мог обновлять переменную Number во время работы приложения. Я делаю что-то совершенно не так?

Например, если для целей тестирования я делаю public void SetNumber(int val) => Environment.Exit(-1);

, то это убивает приложение. Но это не цель здесь.

И, конечно, примеры копирования и вставки :)

РЕДАКТИРОВАТЬ: Есть ли способ для двусторонней связи?

...