나는 (이전의) SQL 서버에서 데이터를 검색하고 나가는 스레드가 있습니다.C# 스레드를 죽이는 방법?
데이터가 들어 오면 모달 대화 상자에 정보를 게시합니다.이 모든 처리가 진행되는 동안 &은 다른 작업을 수행해서는 안됩니다. 모달 대화 상자는 내가 뭔가를하고 있으며 동시에 다른 쿼리를 실행하지 못하게하는 것입니다.
SQL 서버를 호출 할 때 (드물게) 서버가 응답하지 않습니다 (유지 관리, LAN 회선이 끊어 지거나 PC가 네트워크에 연결되어 있지 않음). 쿼리를 수행하는 사람이 시간이 없습니다. 따라서 모달 대화 상자에는 취소 버튼이 있습니다.
스레드 개체 (System.Threading.Thread)의 스레드 수는 IsBackground=true
입니다.
누군가가 취소를 클릭하면 나는 KillThread
방법으로 전화합니다.
참고 :이 & WM5가 BackgroundWorker에없는 몇 가지 윈도우 모바일 5 코드를 공유하기 때문에 내가이 클래스에서 BackgroundWorker 구성 요소를 사용할 수 없습니다.
void KillThread(Thread th) {
if (th != null) {
ManualResetEvent mre = new ManualResetEvent(false);
Thread thread1 = new Thread(
() =>
{
try {
if (th.IsAlive) {
//th.Stop();
// 'System.Threading.Thread' does not contain a definition for 'Stop'
// and no extension method 'Stop' accepting a first argument of type
// 'System.Threading.Thread' could be found (are you missing a using
// directive or an assembly reference?)
th.Abort();
}
} catch (Exception err) {
Console.WriteLine(err);
} finally {
mre.Set();
}
}
);
string text = "Thread Killer";
thread1.IsBackground = true;
thread1.Name = text;
thread1.Start();
bool worked = mre.WaitOne(1000);
if (!worked) {
Console.WriteLine(text + " Failed");
}
th = null;
}
}
출력 창에 "스레드 킬러 실패"가 표시되지만 예외가 발생하지 않습니다.
스레드를 어떻게 중지해야합니까?
가장 관련 게시물은 내가 발견 한 곳이 아래 :
How to Kill Thread in C#?
이
How to kill a thread instantly in C#?
이 편집 : 보인다
이 방법에 약간의 혼동이 될 위에 나열된.
누군가가 취소 버튼을 클릭하면,이 루틴이 호출첫째 : 내가 스레드를 죽일에 갈 때
void Cancel_Click(object sender, EventArgs e) {
KillThread(myThread);
}
다음, 차라리 중지 스레드가 영원히 기다릴 필요가 없습니다 것 . 동시에 스레드가 여전히 활성화되어 있으면 코드를 진행시키고 싶지 않습니다. 따라서 ManualResetEvent
개체를 사용합니다. 은이 스레드를 중지하기 위해 전체 초 (1000ms)를 사용하지 않아야하지만, WaitOne
메서드가 시간 초과 될 때마다 발생합니다.
아직 아이디어를 듣고 있습니다.
비동기 종료 요청으로 SQL 쿼리 신호를 보내거나 그 요청을 취소하는 방법을 이해할 수 없지만 지금 당신의 해당 2 연결을 읽고 있어요. 그들은 길기 때문에 거기에 대답이 있다면 나는 언젠가 그것을 가질 것입니다. – jp2code
오케이, 기사를 읽었습니다. 내 문제는 SQL Server 2000에는 호출을 중단 할 수있는 방법이 없으므로 이전 서버가 버그라고 가정합니다 (Eric Lippert의 기사). – jp2code
그럼, 어떻게해야합니까? 'Abort()'를 호출하고'ManualResetEvent'를 사용하여 GUI를 반환하거나 스레드를'null'으로 설정합니까? 플랜트에있는 모든 사람들이 합류 된 스레드가 종료되기를 영원히 기다리게하지 않을 것입니다. – jp2code