【问题标题】:Triggering basic event in other process在其他进程中触发基本事件
【发布时间】:2012-03-31 22:14:20
【问题描述】:

我需要一个简单的系统,它允许一个进程检查另一个进程是否正在运行(我想我可以使用 Process.getProcessByName 或类似的方法来做到这一点),然后假设它在该进程中触发一个事件。

当我说触发一个事件时,我并不是字面上的意思。我只需要在第二个进程的第一个进程中触发一个子进程。

我知道像这样的 IPC 通常会通过管道或远程处理或类似的东西来完成,但我对这些没有经验并且正在寻找一个快速的解决方案,所以除非这些可以相对容易地使用来解决这个问题,否则我正在寻找换一种方式。

如果有任何不清楚的地方,我会补充细节。

编辑:两个进程将在同一台机器上运行。

感谢您的帮助,

山姆。

【问题讨论】:

    标签: wpf vb.net process ipc


    【解决方案1】:

    这是使用等待句柄的一种非常简单的方法。如果您删除了所有取消代码,这可能会更简单,如果您不需要取消 HandleMessage 线程,这并不是绝对必要的。

    应用 1(信号应用)

    public partial class MainWindow : Window
    {
        readonly EventWaitHandle _waitHandle = 
            new EventWaitHandle(false, EventResetMode.AutoReset, 
                "3bee6ac3-2b48-4515-82f5-4fee255a674e");
    
        public MainWindow()
        {
            InitializeComponent();
        }
    
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            _waitHandle.Set();
        }
    }
    

    应用程序 2(发出信号的应用程序)

    public partial class MainWindow
    {
        private readonly EventWaitHandle _waitHandle = 
            new EventWaitHandle(false, EventResetMode.AutoReset, 
            "3bee6ac3-2b48-4515-82f5-4fee255a674e"); // a unique name
        private readonly CancellationToken _token;
        private readonly CancellationTokenSource _tokenSource;
    
        public MainWindow()
        {
            InitializeComponent();
    
            _tokenSource = new CancellationTokenSource();
            _token = _tokenSource.Token;
    
            Task.Factory.StartNew(HandleMessage, _token);
        }
    
        private void HandleMessage()
        {
            while(!_token.IsCancellationRequested)
            {
                // wait for signal - but only for 1 second
                // so we can check for cancellation
                if (_waitHandle.WaitOne(1000))
                {
                    Debug.WriteLine("Message received");
                }
            }
    
            Debug.WriteLine("Cancelled");
        }
    
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            // stop receiving
            _tokenSource.Cancel();
        }
    }
    

    【讨论】:

    • 谢谢,如果上一个答案中的系统无法正常工作,我会对此进行调查。但是我已经实现了它,它似乎工作得很好,虽然我只是简单地测试过。
    【解决方案2】:

    在 .NET 中,最好的办法是使用 WCF。 WCF 不仅适用于 Web 服务,而且适用于任何进程之间的通信,无论这些进程位于相同还是不同的机器上。如果您有任何 WCF 服务经验,这是最快的解决方案。这是描述该方法的教程:

    http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

    对不起,我没有写任何示例,我是在手机上写的。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多