2013-09-25 2 views
0

모노 2.10.8.1 프레임 워크를 사용하여 하나의 작은 GUI 독립 실행 형 응용 프로그램을 개발하고 있습니다.모노 프레임 워크에서 Thread.Abort() 함수가 작동하지 않습니다.

나는 하나의 바탕 화면 GUI 응용 프로그램을 만들었습니다. 백그라운드에서 일부 작업을 수행하는 데 사용할 수있는 스레드를 만든 다음 작업을 완료 한 후 호출 스레드를 중단했습니다.

Abort() 함수가 아무런 문제없이 Windows에서 잘 작동하지만 Linux에서 작동하지 못했습니다.

Thread t1 = new Thread(Linux_Thread); 
t1.IsBackground = true; 
t1.Start(); 

//Do some operation in some other function. 
Console.WriteLine("Linux thread :: " + t1.ThreadState); 
t1.Abort(); 
Console.WriteLine("Linux thread After Abort :: " + t1.ThreadState); 

SO, 리눅스에서 위 프로그램의 출력은 다음입니다 :

Linux thread :: Background 
Linux thread After Abort :: Background, AbortRequested 

동안 창에서, 위의 프로그램의 출력은 다음과 같습니다 : 그래서

Linux thread :: Background 
Linux thread After Abort :: Stopped 

, Abort() 함수가 Windows 플랫폼에서 작동 할 때 모노 프레임 워크에서 작동하지 않는 것처럼 보입니다.

그런 다음 내 응용 프로그램은 스레드 문제를 중단하고 응용 프로그램이 정지 상태가되어 잘못된 방식으로 작동합니다.

누구든지이 문제에 대한 아이디어가 있거나이 유형의 문제에 직면 한 사람이 있습니까?

실행중인 스레드를 닫는 다른 방법은 무엇입니까?

최대한 빨리 답변을 알려 주시기 바랍니다.

+0

모노 2.10은 오래된 것입니다. 이미 모노 3.2.x – knocte

+0

@knocte로 테스트하십시오 : 우분투 12.04를 사용하고 있으며 "http://www.go-mono.com/mono-downloads/download.html"사이트에서 mono 3.2를 보았습니다. X는 MAC OS, Windows 및 Open Suse를위한 것이지 다른 것들은 3.2.X를 지원하고 있습니까? –

+0

@knocte, mono 3.2.X가 다른 Linux 플랫폼에서 지원된다는 것을 알려주십시오. Open Suse를 제외하고 –

답변

0

Thread.Abort는 악의이므로 가능한 한 피하는 것이 좋습니다.

원하는 것을 구현할 다른 방법이 없다고 확신하는 경우 스레드 중단은 반드시 즉각적인 것은 아니라는 사실을 명심하십시오. 실제로 스레드가 무엇인지에 따라 중단하려고하는 것은하고있는 중입니다.

MSDN says는 "스레드는 전혀 즉시 중단 보장, 또는하지 않습니다."

시도가 t1.Abort()에 호출 후 t1.Join()를 추가 -이 중지되는 경우 다음 뭔가 잘못 될 수 있습니다. 이 경우 모든 스레드에 대해 기본 스택 추적이 필요합니다 (gdb를 첨부해야하는 기본 스택 추적을 얻은 다음을 실행하십시오). thread apply all backtrace

+0

내가 말했듯이 중단하고 조인하는 방법을 시도했습니다. 그 결과 GUI는 그런 식으로 사용 후 정지 상태가됩니다. –

+0

그래서이 조인은이 문제를 해결하는 적절한 방법이 아닙니다. –

+0

Join을 사용할 때 멈 추면 설명대로 gdb를 사용하여 스택 추적을 얻으십시오. –

관련 문제