您可以使用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();
}
}
}
重要提示:此实现不使用队列,因此如果消费者在新消息到达之前未对其进行处理,则可能会错过消息。
如果您不能错过任何消息,则必须改用某种排队实现,例如MSMQ。
但是,您也可以考虑使用Windows Communications Foundation,它允许您在另一个进程中调用远程方法 - 但这可能需要比您想要的更多的进程之间的耦合。
最后,另一种可能性是使用Named Pipe。我实际上认为这可能是最适合您的解决方案。
这里有一个 Microsoft 示例显示使用命名管道的服务器和客户端 IPC:http://msdn.microsoft.com/en-us/library/bb546085%28v=vs.110%29.aspx