注入一个 class 来订阅一个内部事件
Inject a class to subscribe to an inner event
我有以下内容:
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");
}
}
为了让这个 class 被另一个进程消耗并以非线性方式捕获某些东西,方法 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" class 交付的捕获,这个其他进程无法使用 StartProcess 方法(如 class 消费者上面),但可以控制 "Process" class 的创建,因此我正在考虑注入另一个可以链接到 OnCaptureFinished 方法的对象。可以使用事件处理程序吗?
您可以使用 .NET 远程处理进行进程间通信。您可以在 .NET 远程处理上使用 .NET 事件。
这是一篇关于该主题的文章:https://www.codeproject.com/Articles/62813/NET-Remoting-Events-Explained
您可能还想探索异步通信。
如果您只是 运行 同一进程中的一个单独的应用程序域,您可以使用 MarshalByRefObject
来代理应用程序域的调用 in/out。
如果你注入另一个 class(比如嗅探器):
public class Sniffer
{
public Sniffer(){}
public void ProcessResult(Result result)
{
Console.WriteLine("Sniffer I have: {0}", result);
}
}
在您现有的流程中 class:
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");
}
}
完成后,您可以在嗅探器 class 中获取消息,并从主线程调用它:
_sniffer = new Sniffer();
_process = new Process(_sniffer);
这是您要找的吗?
基于@Juanito 的回答。我设计了以下内容:
public class Sniffer
{
public Action<Result> CaptureFinishedSniffed;
public Sniffer()
{
CaptureFinishedSniffed = Captured;
}
public void Captured(Result result)
{
Console.WriteLine("Proper sniffer I have: {0}", result);
}
}
然后在过程中 class:
public class Process
{
private Action<Result> CaptureFinished = null;
private Action<Result> CaptureSniffed = null;
private Sniffer _sniffer;
public Process(Sniffer sniffer)
{
_sniffer = sniffer; //1. INJECTION
CaptureSniffed = sniffer.CaptureFinishedSniffed;//2.Plumbing with the delegate
}
public Result StartProcess(Action<Result> onCaptureFinished)
{
CaptureFinished = onCaptureFinished;
...
CaptureFinished.Invoke(result);
CaptureSniffed.Invoke(result); //3.Invoking
return new Result("OK");
}
}
如您所见1.and 2. 正在提供注入和所需的管道以将嗅探器与其在 "Process" class 内的委托连接起来。第 3 步只是调用所需的方法在进程线程外进行进一步处理。
我有以下内容:
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");
}
}
为了让这个 class 被另一个进程消耗并以非线性方式捕获某些东西,方法 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" class 交付的捕获,这个其他进程无法使用 StartProcess 方法(如 class 消费者上面),但可以控制 "Process" class 的创建,因此我正在考虑注入另一个可以链接到 OnCaptureFinished 方法的对象。可以使用事件处理程序吗?
您可以使用 .NET 远程处理进行进程间通信。您可以在 .NET 远程处理上使用 .NET 事件。
这是一篇关于该主题的文章:https://www.codeproject.com/Articles/62813/NET-Remoting-Events-Explained
您可能还想探索异步通信。
如果您只是 运行 同一进程中的一个单独的应用程序域,您可以使用 MarshalByRefObject
来代理应用程序域的调用 in/out。
如果你注入另一个 class(比如嗅探器):
public class Sniffer
{
public Sniffer(){}
public void ProcessResult(Result result)
{
Console.WriteLine("Sniffer I have: {0}", result);
}
}
在您现有的流程中 class:
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");
}
}
完成后,您可以在嗅探器 class 中获取消息,并从主线程调用它:
_sniffer = new Sniffer();
_process = new Process(_sniffer);
这是您要找的吗?
基于@Juanito 的回答。我设计了以下内容:
public class Sniffer
{
public Action<Result> CaptureFinishedSniffed;
public Sniffer()
{
CaptureFinishedSniffed = Captured;
}
public void Captured(Result result)
{
Console.WriteLine("Proper sniffer I have: {0}", result);
}
}
然后在过程中 class:
public class Process
{
private Action<Result> CaptureFinished = null;
private Action<Result> CaptureSniffed = null;
private Sniffer _sniffer;
public Process(Sniffer sniffer)
{
_sniffer = sniffer; //1. INJECTION
CaptureSniffed = sniffer.CaptureFinishedSniffed;//2.Plumbing with the delegate
}
public Result StartProcess(Action<Result> onCaptureFinished)
{
CaptureFinished = onCaptureFinished;
...
CaptureFinished.Invoke(result);
CaptureSniffed.Invoke(result); //3.Invoking
return new Result("OK");
}
}
如您所见1.and 2. 正在提供注入和所需的管道以将嗅探器与其在 "Process" class 内的委托连接起来。第 3 步只是调用所需的方法在进程线程外进行进一步处理。