2012-03-18 3 views
3

인터넷에서 뭔가를 다운로드하기 위해 스레드를 사용하고 있습니다. 내 스레드 메서드 내부에 루프가 없습니다. StreamReader.ReadToEnd() 메서드를 사용하고 있습니다. 따라서 내 스레드에서 큰 것을 다운로드 할 때이 스레드를 중지하고 싶습니다. thread.Abort() 메소드가 없어도 좋다. GC 스레드에 정리를 제공하거나 종료 할 수 있습니까?C#의 스레드를 즉시 죽이는 방법

답변

12

ReadToEnd을 사용하지 말고 루프를 만들고 X 문자를 한 번에 읽거나 한 번에 한 줄씩 ReadLine으로 읽습니다. 루프 내에서 AutoResetEvent이 (.WaitOne(0)을 사용하여) 설정되었는지 확인한 다음 루프를 종료하십시오.

다운로드를 중지하려면 다른 스레드에서 재설정 이벤트 (Set 사용)를 설정하십시오.

+0

일에 있었다. 끝까지 읽는 것은 정말 안좋은 일입니다. 중단하지 마시고 그렇지 않으면 시작에 할당 할 수없는 많은 메모리를 사용하게 될 것입니다 (64 또는 128k 버퍼로 충분할 수도 있음). – TomTom

+1

StreamReader에서는 X 바이트를 읽지 않습니다. 그 생각을 ReadLine()으로 바꾸십시오. –

2

BaseStream BeginRead() 비동기 메소드를 사용할 수 있습니다. 전용 스레드 (1MB의 커밋 된 메모리를 사용함)를 생성하는 대신이 방법을 사용하는 것이 좋습니다. 비동기 메서드는 I/O 완료 포트를 사용하므로 더 효율적입니다.

new StreamReader(aStream).BaseStream.BeginRead() 

는 여기에 몇 가지 추가 정보를 http://msdn.microsoft.com/en-us/library/system.io.stream.beginread.aspx

비동기 읽기를 정지에 관련된 스레드입니다.

Stop Stream.BeginRead()

0

은 무엇 조지 Duckett 말했다하지만 당신은 스레드/비동기 작업을 시작합니다 닷넷 4 Task 클래스를 사용하고 CancellationToken에 전달하고 루프 체크하면 IsCancellationRequested = 사실

관련 문제