PC의 USB 포트에 연결된 USB-CAN 변환기와 상호 작용하는 C# (Visual Studio 2010)으로 개발 된 Windows 응용 프로그램이 있습니다. 하나의 스레드에서 UI를 구현하고 별도의 스레드에서 전송 및 수신 논리를 구현했습니다. 내 작업이 끝나면이 스레드를 닫고 현재 걸려있는 UI 스레드로 돌아가고 싶습니다 !!C# 멀티 쓰레딩 문제
강제 종료 기능을 사용하여 스레드를 강제 종료하려고 시도했지만 예외가 발생합니다. 어떻게 성공적으로이 작업을 끝내야합니까?
나는 다음 두 질문이 있습니다
- 어떻게 정상적으로 스레드를 종료하고 UI 스레드에 반환을?
- 왜이 전송 및 수신 스레드가 UI 스레드를 중단하고 정지시키지 않습니까?
코드의 아래 부분은 참조 용입니다 :
#region recievedthrad
public void ThreadProcReceive()
{
try
{
bool fDoExit = false;
do
{
if (bFlag)
DeleteAllResources(); // This will free all the driver resources.
// wait for receiving messages or exiting this thread
/* Note: After completion of the task, this method needs to return a 0 or 2 value. But still it returns 1 or 258 and never exits the thread. */
int index = WaitHandle.WaitAny(m_RxWaitHandles);
if (index == 0)
{
// exit this thread
fDoExit = true;
}
else if (index == 1)
{
// receive all messages
ReceiveAllCanMessages();
}
else if (index == 2)
{
// exit this thread
ReceiveStatus(UcanDotNET.USBcanServer.USBCAN_CHANNEL_CH0);
}
} while ((fDoExit == false));
}
catch(Exception ex)
{
}
}
#endregion
혼란 스럽습니다. GUI 스레드와 USB/CAN 통신을하는 다른 스레드가 있습니다. 왜 GUI 쓰레드가 걸려 있습니까? comms 스레드가 종료하고 핸들 (Thread.Join)에서 대기하도록 신호를 보내려고하기 때문에 매달려 있다면 그냥하지 마십시오! 끝내기 위해 신호를 보내십시오. 음, 그냥 기다리지 마십시오. 당신은 어쨌든 끝내야합니까 - 그냥 주변에 놓아 두지 않는 이유는 무엇입니까? –
이것은 BackgroundWorker를 사용하기에 좋은 곳이 될 수 있습니다 –
'index == 2 '의 경우'/ /이 스레드를 종료하십시오'라는 주석이 있지만'fDoExit = true'를 설정하지 않았습니다. – Henrik