Запуск основного события в другом процессе - PullRequest
0 голосов
/ 01 апреля 2012

Мне нужна простая система, которая позволяет одному процессу проверять, запущен ли другой процесс (я думаю, что я могу сделать это нормально, используя Process.getProcessByName или подобное), а затем инициировать событие в этом процессе, предполагая, что это так.

Когда я говорю «вызвать событие», я не имею в виду это буквально.Мне просто нужно запускать сабвуфер в первом процессе со второго.

Я знаю, что подобный IPC обычно выполняется с использованием каналов или удаленного взаимодействия или чего-то в этом роде, но у меня нет опыта работы с ними, и я ищубыстрое решение, поэтому, если это не может быть использовано относительно легко для решения этой проблемы, я ищу альтернативу.

Если это не совсем понятно, я добавлю детали.

РЕДАКТИРОВАТЬ: Оба процесса будут работать на одном компьютере.

Спасибо за вашу помощь,

Сэм.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2012

Вот очень простой способ использования дескриптора ожидания. Это может быть проще, если вы удалили весь код отмены, что не является строго необходимым, если вам не нужно отменять поток 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();
    }
}
1 голос
/ 01 апреля 2012

В .NET лучшая идея - использовать WCF. WCF предназначен не только для веб-служб, но и для связи между любыми процессами, независимо от того, находятся ли они на одном или разных компьютерах. Если у вас есть опыт работы с сервисами WCF, это самое быстрое решение. Вот учебник, который описывает метод:

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

Извините, я не пишу ни одного примера. Я пишу это по телефону. Надеюсь, это поможет!

...