2012-04-05 11 views
2

PCのUSBポートに接続されたUSB-CANコンバータと対話しているWindowsアプリケーションをC#(Visual Studio 2010)で開発しました。私は1つのスレッドでUIを実装し、別々のスレッドで送受信ロジックを実装しました。私の仕事の完了後、私はこのスレッドを閉じて、現在ぶら下がっているUIスレッドに戻ってほしい!!C#マルチスレッドの問題

私は強制的にスレッドを強制終了しようとしましたが、それは例外をスローします。どのように正常に私の仕事の完了後にこのスレッドを終了する。

I以下の2つの質問があります。

  1. どのように優雅にスレッドを終了し、UIスレッドに戻りますか?
  2. なぜこの送受信スレッドが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 
+2

私は混乱しています。 GUIスレッドとUSB/CAN通信を行う他のスレッドがあります。なぜGUIスレッドがぶら下がっていますか? commsスレッドがそのハンドル(Thread.Join)を終了して待機するように通知しようとしているためにハングアップしている場合は、しないでください!それを終わらせるようにシグナルを出して、それを待ってはいけません。とにかくそれを終了する必要があります - なぜそれを周りに横たわるままにしないでください? –

+3

これは、BackgroundWorkerを使うのに良い場所です。 –

+2

'index == 2 'の場合は、'//このスレッドを終了する'というコメントがありますが、 'fDoExit = true'は設定していません。 – Henrik

答えて

0

優雅にスレッドを終了し、UIスレッドに戻るにはどのように?

スレッドがこのライブラリは優雅にその操作のいずれかを終了させる能力を持っていると仮定して...その後、あなたはそれをブロック解除するために、別のUcanDotNet APIを使用する必要があります呼び出しますUcanDotNetこれらのいずれかの内部でブロックしている場合。私はこのUcanDotNetライブラリに精通していないので、その機能が何であるか分かりません。

このUcanDotNetライブラリは、操作をキャンセルするために必要な手段を提供していない場合、これらの呼び出しを別のプロセスに入れてWCF経由で通信する以外は選択肢がありません。そうすれば、それを突然終了させなければならないならば、プロセスを殺すだけです。スレッドを中止するとメモリが壊れる可能性があるため、とにかくThread.Abortを呼び出すよりも安全です。

なぜこの送受信スレッドは中断せず、ハングするのですか UIスレッド?

Thread.Abortはブロッキングコールです。これは、スレッドに打ち切りが挿入されるのを待ちます。私はあなたの問題は、finallyブロックまたはアンマネージコードなどの非同期例外注入を許可しないコンテキストでスレッドが実行されていることを疑う。これは、以下のコードを使用して簡単に説明することができます。

public static void Main(string[] args) 
{ 
    int i = 0; 
    var t = new Thread(() => 
    { 
     try 
     { 
     } 
     finally 
     { 
      while (true) i++; 
     } 
    }); 
    t.Start(); 
    Thread.Sleep(1000); 
    t.Abort(); // this blocks indefinitely! 
    Console.WriteLine("aborted"); // never gets here! 
} 
関連する問題