【问题标题】:Can I use events to signal between applications?我可以使用事件在应用程序之间发出信号吗?
【发布时间】:2014-03-10 00:11:26
【问题描述】:

我有一个更新一些报告信息的 Windows 服务。

我在同一台机器上运行了一些其他应用程序,它们可以执行应该导致更新报告信息的事情。

任何一方都不知道另一方,但我希望能够让应用程序做一些事情来表明应该进行更新。

我最初的想法是让应用程序引发某种系统范围的事件。他们不知道也不关心是否有其他服务正在监听它来处理它。

同时,该服务正在侦听该事件,并且不知道也不关心是谁提出的。

我可以通过写入系统事件日志的应用程序以及侦听该日志事件的服务来完成此操作....但这似乎使应用程序事件日志变得混乱。

还有其他更合适的方法来处理这个问题吗?

【问题讨论】:

标签: c# .net events messaging event-log


【解决方案1】:

从发送消息的应用程序中,您可以发出限制在本地机器上的 UDP 广播,并使 windows 服务侦听该端口。

这样,应用程序不需要知道windows服务,反之亦然。它们都是独立的,可以以自己的方式部署。

【讨论】:

  • +1 这很聪明。我应该期望仅发送到本地主机的数据包具有很好的可靠性...
【解决方案2】:

您可以使用内存映射文件来指示报告过程。下面的例子摘自MSDN

第一个过程:

class Program
{
    // Process A: 
    static void Main(string[] args)
    {
        using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
        {
            bool mutexCreated;
            Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
            using (MemoryMappedViewStream stream = mmf.CreateViewStream())
            {
                BinaryWriter writer = new BinaryWriter(stream);
                writer.Write(1);
            }
            mutex.ReleaseMutex();

            Console.WriteLine("Start Process B and press ENTER to continue.");
            Console.ReadLine();

            Console.WriteLine("Start Process C and press ENTER to continue.");
            Console.ReadLine();

            mutex.WaitOne();
            using (MemoryMappedViewStream stream = mmf.CreateViewStream())
            {
                BinaryReader reader = new BinaryReader(stream);
                Console.WriteLine("Process A says: {0}", reader.ReadBoolean());
                Console.WriteLine("Process B says: {0}", reader.ReadBoolean());
                Console.WriteLine("Process C says: {0}", reader.ReadBoolean());
            }
            mutex.ReleaseMutex();
        }
    }
}

还有第二个过程:

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;

class Program
{
    // Process B: 
    static void Main(string[] args)
    {
        try
        {
            using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap"))
            {

                Mutex mutex = Mutex.OpenExisting("testmapmutex");
                mutex.WaitOne();

                using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0))
                {
                    BinaryWriter writer = new BinaryWriter(stream);
                    writer.Write(0);
                }
                mutex.ReleaseMutex();
            }
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("Memory-mapped file does not exist. Run Process A first.");
        }
    }
}

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2011-02-03
    • 2013-01-05
    相关资源
    最近更新 更多