PCのUSBポートに接続されたUSB-CANコンバータと対話しているWindowsアプリケーションをC#(Visual Studio 2010)で開発しました。私は1つのスレッドでUIを実装し、別々のスレッドで送受信ロジックを実装しました。私の仕事の完了後、私はこのスレッドを閉じて、現在ぶら下がっているUIスレッドに戻ってほしい!!C#マルチスレッドの問題
私は強制的にスレッドを強制終了しようとしましたが、それは例外をスローします。どのように正常に私の仕事の完了後にこのスレッドを終了する。
I以下の2つの質問があります。
- どのように優雅にスレッドを終了し、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