Введите класс для подписки на внутреннее событие - PullRequest
1 голос
/ 26 сентября 2019

У меня есть следующее:

public class Process
{
    private Action<Result> CaptureFinished = null;

    public Result StartProcess(Action<Result> onCaptureFinished)
    {
        CaptureFinished = onCaptureFinished;

        Console.WriteLine("Process invokes capture");
        CaptureFinished.Invoke(new Result("This is the capture"));

        return new Result("OK");
    }
}

Чтобы этот класс использовался другим процессом и захватывал что-то нелинейным образом, метод OnCaptureFinished помогает процессу получения получить захват.

public class Consumer
{
    private Process _process;

    public Consumer(Process process)
    {
        _process = process;
        _process.StartProcess(Consume);
    }

    public void Consume(Result result)
    {
        Console.WriteLine("Consumer receives: {0}", result.ToString());
    }
}

Я вынужден создать другой процесс, который получит перехват, доставленный классом «Process1», этот другой процесс не может использовать метод StartProcess (как вышеупомянутый потребитель класса), но может контролировать созданиекласс «Process», поэтому я думал о внедрении другого объекта, который можно связать с методом OnCaptureFinished.Можно ли это сделать с помощью обработчика событий?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Вы можете использовать .NET Remoting для межпроцессного взаимодействия.Вы можете использовать события .NET поверх удаленного взаимодействия .NET.

Вот статья на эту тему: https://www.codeproject.com/Articles/62813/NET-Remoting-Events-Explained

Возможно, вы также захотите изучить асинхронную связь.

Есливы просто используете отдельный домен приложения в том же процессе, который можете использовать MarshalByRefObject для прокси-вызовов в / из домена приложения.

1 голос
/ 30 сентября 2019

Если вы внедрите другой класс (например, сниффер):

public class Sniffer
{
    public Sniffer(){}

    public void ProcessResult(Result result)
    {
        Console.WriteLine("Sniffer I have: {0}", result);
    }
}

В существующем классе процесса:

public class Process
{
    private Action<Result> CaptureFinished = null;
    private Sniffer _sniffer;

    public Process(Sniffer sniffer)
    {
        _sniffer = sniffer;
    }

    public Result StartProcess(Action<Result> onCaptureFinished)
    {
        CaptureFinished = onCaptureFinished;
        ...
        CaptureFinished.Invoke(result);
        _sniffer.ProcessResult(result);

        return new Result("OK");
    }
}

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

_sniffer = new Sniffer();
_process = new Process(_sniffer);

Это то, что вы ищете?

...