2011-08-31 5 views
1

데이터를 수신 대기하는 방법이 있습니다. networkstream.read 메서드가 동기식이기 때문에 별도의 스레드에서 실행해야합니다. 그래서 별도의 스레드에서 실행하는 방법은 다음과 같습니다 내가 스레드를 종료 할 수 있어요멈춤 스레드가 작동하지 않습니다.

void someMethod(param1, param2....) 
{ 
    try{ 
    while(stream.read(data...) != 0) // code waits here until data is received 
    { 
     // do stufff 

    } 
    }catch{}// 
} 

있는 유일한 방법은 스트림 및 실행됩니다 catch 블록을 닫는 것입니다. 때로는 동일한 스트림에서 다른 방법으로 데이터를 듣기 시작해야합니다. 그래서 스레드를 t = new Thread (새로운 threadstart (somemethod ......))로 작성한 다음 t.start (someObject)를 수행하고 나중에 t.abort()를 수행 할 때 해당 메소드가 여전히 수신 대기하게됩니다 .? 데이터는 어떻게 또한

을 종료 할 수 있습니다 I는 다음과 같은 전역 변수를 만드는 시도했다 :.

bool someBoolean = false; 

void someMethod(param1, param2....) 
{ 
    try{ 
    while(someBoolean ==false && stream.read(data...) != 0) // code waits here until data is received 
    { 
     // do stufff 

    } 
    }catch{}// 
} 

그때 나는 그것을 않습니다 어떤 이유로 메소드가 실행이 중지됩니다 true로 someBoolean 변경된 것을 생각 왜 someBoolean은 한 번에 두 개의 변수가됩니다. 주 스레드에서 값을 변경하면 두 번째 스레드에 영향을 미치지 않으므로 ...

+0

스트림에서 버퍼 방식으로 읽어야한다는 것은 잠시 동안 작은 양의 데이터를 읽음을 의미합니다. 읽고 쓰는 방법과 스레드가 작동하는 방식에 대한 실제 코드를 보여줍니다. –

+1

'stream.Read'는 데이터가 사용 가능할 때까지 차단되므로 부울을 설정하면 그 시점에서 도움이되지 않습니다. – dlev

답변

1

I gu 스레드가 abortet 수 있지만 해당 스레드 (스트림으로 인해 관리되지 않음) 리소스를 다음 해제되지 않습니다 - 그게 당신 문제입니다.

중단하지 말고 스레드를 중지하지 마십시오.

중지하십시오. Stream.read의 비동기 버전을 CancellationToken과 함께 사용해보십시오. 당신이 우리에게 더 많은 정보를 주었다면 (어떤 스트림? - 읽기가 이상하게 ("R"ead?), 스레드 시작) 나는 당신에게 더 자세한 정보를 주려고합니다.

추 신 : 스레드 대신 System.Threading.Task를 사용하십시오. 작업하기에 더 좋은 방법입니다.

ManualThreadEvent terminate = new ManualThreadEvent(false); 
bool someBoolean = false; 

void someMethod(param1, param2....) 
{ 
    try{ 
    // wait for enough data or for termination: 
    while(terminate.WaitOne(100) == false && stream.DataAvaiable <= bytesNeeded) 
    { /* nothing to do here */ } 

    if (terminate.WaitOne(0)) return; // terminate on request 

    // To your stuff with read 
    }catch{}// 
} 

void Terminate() 
{ 
    terminate.Set(); 
} 
+0

stream.read의 비동기 버전을 만드는 것이 좋습니다. 스트림은 NetworkStream 유형이며 기본적으로 서버 (tcpListener 객체)와 클라이언트 사이에 tcp 연결을 만들 때 만듭니다. –

+0

NetworkStream은 아무 문제가 없습니다. (BeginRead/EndRead를 찾아보십시오) - 그러나 컴파일 할 코드를 제공하는 것이 좋습니다 - 위 코드는 조각이며 좋은 조언을하기 어렵습니다. 비동기 버전을 사용하고 작업으로 전환하는 것을 고려 했으므로 CancellationToken- 물건을 사용하면 잘 처리해야합니다. 또한 .DataAvailable 스트림을 사용하여 데이터를 확인한 다음 잠시 잠을 자거나 짧은 시간 동안 종료 신호를 기다릴 수 있습니다. – Carsten

1

가 어떻게 그것을 종료 할 수 있습니다 : 추가 정보없이 빠른 수정으로

, 당신은 이런 식으로 뭔가를 시도 할 수?

차단 된 스트림 호출을 해제하는 표준 프로토콜은 스트림을 닫고 예외를 catch하는 것입니다. 읽기를 방해해서 다른 방법으로 옮길 수있는 경우는 매우 드뭅니다. 이것이 여전히 필요하다고 생각되면 읽기 작업에 추가 수준의 간접 참조를 제공해야합니다. 동기 호출이 아닌 BeginRead과 같은 비동기 호출을 사용할 때 이와 같은 시나리오를 다루는 것이 훨씬 쉽습니다. Thread.Abort을 통해 스레드를 종료하면 해결할 수있는 것보다 더 많은 문제가 발생할 수 있습니다.

그런 다음 someBoolean을 true로 변경하면 메소드가 중지됩니다. 실행 중입니다. 웬일인지 그것은하지 않는다. 왜? someBoolean처럼 보입니다 한 번에 두 변수입니다. 주요 스레드에서 값을 변경하면 ... 두 번째 스레드에 영향을 미칠 것 같지 않기 때문에

그것은 가능한 메모리 장벽의 부족이 문제가 발생할 수 있지만, 더 큰 원인이 있다는 것입니다 스레드가 Read 안에 붙어 있고 실제로는 someBoolean 읽고 싶지 않습니다.

관련 문제