Kil*_*zur 1 c# process event-handling
Hellu
问题很简单,但答案似乎很多,而且很不清楚.
如何在应用程序A中处理应用程序B发送的事件,以及如何在B中实现这些事件?知道B不知道A的存在.
假设B是一种"批处理"类型的程序,在后面做事情,没有任何图形显示,A是一个很好的GUI (双关语)应该写消息B在对话框或其他东西中发送给他.
我找到了有关这方面的有趣答案(就像这一个或这个),但实际上没有人用C#的例子回答这个问题; 充其量,他们重定向到一些外部工具.
我听说这是C#中的一个问题,但最后有没有一个干净的方法呢?谢谢.
如果这可以缓解这个问题,让我们说A启动B(带有Process或者其他东西),知道B也可以单独启动(在这种情况下,我不需要整个事件处理事情).
您可以使用组合MemoryMappedFile,Mutex并EventWaitHandle在进程之间进行管理.
以下示例显示了它的工作方式.在实际代码中,该producer()方法与该consumer()方法的应用程序不同,但这用于说明实现:
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
void run()
{
Task.Run(() => consumer());
Task.Run(() => producer());
Console.WriteLine("Press <ENTER> to stop.");
Console.ReadLine();
}
static void producer()
{
using (var mmf = MemoryMappedFile.CreateOrOpen("MyMapName", 1024))
using (var view = mmf.CreateViewStream())
{
var writer = new BinaryWriter(view);
var signal = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName");
var mutex = new Mutex(false, "MyMutex");
for (int i = 0; i < 100; ++i)
{
string message = "Message #" + i;
mutex.WaitOne();
writer.BaseStream.Position = 0;
writer.Write(message);
signal.Set();
mutex.ReleaseMutex();
Thread.Sleep(1000);
}
}
}
static void consumer()
{
using (var mmf = MemoryMappedFile.CreateOrOpen("MyMapName", 1024))
using (var view = mmf.CreateViewStream())
{
var reader = new BinaryReader(view);
var signal = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName");
var mutex = new Mutex(false, "MyMutex");
while (true)
{
signal.WaitOne();
mutex.WaitOne();
reader.BaseStream.Position = 0;
var message = reader.ReadString();
Console.WriteLine("Received message: " + message);
mutex.ReleaseMutex();
}
}
}
static void Main()
{
new Program().run();
}
}
}
Run Code Online (Sandbox Code Playgroud)
重要信息:此实现不使用队列,因此如果消息在新消息到达之前未处理消息,则消息可能会丢失消息.
如果您不能错过任何消息,则必须使用某种排队实现,例如MSMQ.
但是,您也可以考虑使用Windows Communications Foundation,它允许您在另一个进程中调用远程方法 - 但这可能需要在进程之间实现比您想要的更多耦合.
最后,另一种可能性是使用a Named Pipe.我实际上认为这对你来说可能是最好的解决方案.
这里有一个Microsoft示例显示使用命名管道的服务器和客户端IPC:http://msdn.microsoft.com/en-us/library/bb546085%28v=vs.110%29.aspx
| 归档时间: |
|
| 查看次数: |
2446 次 |
| 最近记录: |