2010-07-05 9 views
1

먼저 질문을하기 전에 내가 무엇을하려고하는지 설명하겠습니다. 기본적으로 특정 컴퓨터에서 실행되는 Windows 서비스가 M1이라고합시다. 이 Windows 서비스는 스레드를 사용하여 일련의 작업을 실행합니다 (각 작업 파티션마다 스레드 1 개). 사용자가 응용 프로그램의 관리 패널에서 파티션을 중지/일시 중단/다시 시작할 수있는 기능을 프로그래밍해야합니다. 내 솔루션은 해당 스레드를 ID/이름으로 액세스하는 것입니다. 스레드가 생기면 올바른 작업을 수행 할 수 있습니다. 올바른 접근 방식입니까?원격 스레드에 액세스하는 방법?

그렇다면 어떻게해야합니까? 스레드가 M1에서 실행 중이며 원격 컴퓨터 (동일한 네트워크 영역에 위치)에서 스레드에 액세스해야합니다. 심지어 가능할까요?

감사합니다. 필요할 경우 주저없이 더 자세한 설명을 요청하십시오.

+0

원격 컴퓨터에서 .exe를 시작할 수 있습니까? 그렇다면 .Net Remoting을 사용할 수 있습니다. –

답변

2

스레드 관리를 원격 프로세스로 직접 제어하는 ​​것은이를 해결하는 위험한 방법입니다. 일시 중단 요청 등을 청취하는 스레드를 설정하고 요청자를 대신하여 스레드를 조작 할 수 있습니다. 그러나 스레드를 일시 중단 할 때 스레드의 상태를 알지 못하기 때문에 끝없는 문제가 발생할 수 있습니다. 특히 잠금이 유지되거나 데이터베이스 트랜잭션 중간에있을 수 있습니다.

작업이 오래 지속되는 경우 각 스레드 요청은 현재 작업을 완료 할 때마다 보스로부터 작동하도록하십시오. 파티션을 일시 중지하려면 추가 통지가있을 때까지 파티션의 스레드에 더 이상 작업하지 않도록 (TCP, 웹 서비스 등을 통해) 상사에게 알리십시오.

+0

실제로 작업이 오래 가지 않습니다. 파티션을 중지/일시 중지하려는 이유는 일부 작업을 완료하는 데 많은 시간이 필요하며 매개 변수를 변경하려는 경우 작업 실행이 끝날 때까지 기다려야합니다. –

+0

@Amokrane : 매개 변수를 변경하기 전에 완료 될 때까지 기다려야하는 경우 어떻게 작업을 일시 중단하는 데 도움이됩니까? –

+0

사실 나는 현존하는 코드에 대해 이야기하고있었습니다. 이 새로운 기능을 제공하면 작업이 끝나기 전에 스레드를 중지하고 매개 변수를 변경할 수 있습니다. –

2

나는 그것이 올바른 접근이라고 생각하지 않습니다. menage 스레드에 기능을 제공하는 인터페이스가있는 것이 더 좋습니다.

+0

당신은 원격 기계의 스레드를 관리 할 Webservice를 설정하는 것을 의미합니까? –

+0

예, WebService 또는 Remoting –

+0

Asp.Net 웹 서비스 및 Remoting은 WCF로 대체 된 레거시 기술입니다. 그리고 웹 서비스가 WCF를주의 깊게 사용해야한다는 것을 의미한다면 그들은 똑같은 것이 아닙니다. –

1

수행 할 작업을 정의하는 데 필요한 매개 변수를 사용하여 TCP 또는 .NET 리모팅을 통해 프로세스와 통신합니다.

그런 다음이 요청을 관리하는 클래스가 필요하며이를 수행 할 스레드에게 알립니다.

+0

웹 서비스는 어떻습니까? –

+0

.Net 원격은 다소 오래되었습니다. WCF 기반 서비스는 IMO 구현, 구성 및 보안이 더 쉽습니다. –

+0

확인. WCF를 통해 그렇게 할 것입니다. –

1

스레드 ID를 사용하지 않겠습니다. 스레드 이름은 가능성이 있지만 각 작업의 이름을 제공하고 키잉에 신경 쓰는 편이 낫습니다.

이 문제를 해결하려면 Windows 서비스에서 Window Communication Foundation (WCF) 인터페이스를 노출해야합니다. 그런 다음 응용 프로그램은 해당 인터페이스를 통해 작업을 제어합니다.

.NET Remoting을 사용하지 마십시오. 작동하지만, .NET Remoting has been superseded by WCF. MSDN 문서에서 :

WCF는 분산 응용 프로그램을 만들기위한 이전의 여러 Microsoft 기술을 대체합니다. ASP.NET 웹 서비스, Remoting, Enterprise Services, System.Messaging 또는 WSE를 사용하여 을 작성한 응용 프로그램은 대부분 이 WCF를 기반으로 작성됩니다.

+0

어떤 (id/name)이라고 말하면, 이름에서 스레드의 인스턴스를 가져올 수 있다고 생각합니까? 그건 그렇고, 나는 ID를 사용하지 않을거야, 그것은 신뢰할 수 없어. –

+1

AFAIK, 관리되는 스레드 목록을 열거 할 방법이 없습니다. 이렇게하려면 유지 관리하는 개체의 각 스레드를 래핑하는 것이 좋습니다. 여기를 참고하십시오 : http://stackoverflow.com/questions/1825882/getting-list-of-currently-active-managed-threads-in-c-net –

관련 문제