2010-07-05 3 views
1

Сначала я собираюсь объяснить, что я пытаюсь сделать, прежде чем задавать вопрос напрямую. В принципе, есть служба Windows, работающая на определенной машине, назовем ее M1. Эта служба Windows запускает набор задач с использованием потоков (1 поток для каждого раздела задач). Мне нужно запрограммировать функциональность, которая позволит пользователю остановить/приостановить/перезапустить раздел с панели администрирования приложения. Мои решения состоят в доступе к этим потокам по их идентификатору/имени. Как только у меня есть поток, я могу сделать правильную операцию на нем. Правильно ли это?C# - Как получить доступ к удаленной нити?

Если да, то как мы это делаем? Потоки работают в M1, и мне нужно получить к ним доступ с удаленного компьютера (расположенного в той же сетевой области). Возможно ли это?

спасибо. Не стесняйтесь обращаться за дополнительными разъяснениями, если это необходимо.

+0

Вы можете запустить .exe на удаленной машине? Если да, вы можете использовать .Net Remoting. –

ответ

2

Предоставление прямого управления управлением потоками для удаленного процесса является опасным способом решения этой проблемы. Вы можете настроить поток, который будет прослушивать запросы на приостановку и т. Д., И управлять потоками от имени запрашивающего. Но это может вызвать бесконечные проблемы, так как вы не знаете, в каком состоянии находится поток, когда вы его приостанавливаете. В частности, он может содержать блокировки или находиться в середине транзакции базы данных.

Если задачи недолговечны, запросите каждый запрос потока от начальника, когда он завершает свою текущую работу. Чтобы приостановить раздел, сообщите начальнику (через TCP, веб-службы или что-то еще), чтобы не дать потоку раздела больше работать до дальнейшего уведомления.

+0

На самом деле задачи недолговечны. Причина, по которой мы хотим остановить/приостановить разделы, состоит в том, что некоторые задачи занимают много времени, и если мы хотим изменить параметр, например, мы должны ждать, пока задача не завершит ее выполнение. –

+0

@Amokrane: Если вам нужно дождаться, когда он закончит, прежде чем изменять параметры, как это поможет приостановить выполнение задачи? –

+0

На самом деле я говорил о существующем коде. Предоставление этой новой функциональности позволит людям остановить поток и изменить параметры до конца задачи. –

2

Я не думаю, что это правильный подход. Будет лучше иметь интерфейс в сервисе, который обеспечит функциональность для нисходящих потоков.

+0

Вы хотите настроить веб-сервис, который будет управлять потоками на удаленном компьютере? –

+0

Да, WebService или Remoting –

+0

Веб-службы Asp.Net и Remoting - это устаревшие технологии, которые были заменены WCF. И если через Web Services вы имели в виду WCF, это не одно и то же. –

1

Я бы связался с процессом через удаленный TCP или .NET с параметрами, необходимыми для определения выполняемой задачи.

Тогда вам понадобится класс, который управляет этими запросами и связывается с потоками, говоря им, что делать.

+0

Как насчет веб-сервиса? –

+0

. Удаленный доступ к сети довольно устарел. Сервисы, основанные на WCF, проще внедрять, настраивать и защищать IMO. –

+0

Хорошо. Будет делать это через WCF. –

1

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

Если бы я решил эту проблему, я бы разоблачил интерфейс Window Communication Foundation (WCF) на вашей службе Windows. Затем ваше приложение будет контролировать задачи через этот интерфейс.

Я бы не использовал .NET Remoting. Он будет работать, но .NET Remoting has been superseded by WCF. Из статьи MSDN:

WCF заменяет несколько ранее технологий Microsoft для создания распределенных приложений. Большинство приложений, которые были бы , построенные с использованием веб-служб ASP.NET, .NET Remoting, Enterprise Services, System.Messaging или WSE вместо будут построены на WCF.

+0

Говоря о том, что (id/name), вы думаете, что можно получить экземпляр потока из его имени? Кстати, я не буду использовать идентификатор, он не является надежным. –

+1

AFAIK, нет возможности перечислить список управляемых потоков. Чтобы сделать это, вы можете рассмотреть возможность переноса каждого потока в объект, который вы поддерживаете. См. Здесь: http://stackoverflow.com/questions/1825882/getting-list-of-currently-active-managed-threads-in-c-net –

Смежные вопросы