Interestです。質問しておきながら自分で解決してしまいました。
問題の原因は前回の Invoke の仕方にあったようです。
解決できた状態のコードを記載します。
delegate void SetTextCallback(String^ text);
private: void SetText(String^ text){
if( this->serialLogText->InvokeRequired )
{
SetTextCallback^ d = gcnew SetTextCallback(this, &GPSLibTest::Form1::SetText);
// this->Invoke( d, text ); // これでは Close時にフリーズする
this->BeginInvoke( d, text ); // こっちが正解
}
else
{
this->serialLogText->Text += text;
}
}
private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e){
String^ str;
try{
str = serialPort1->ReadLine();
SetText(str);
}
catch(InvalidOperationException^ e){
SetText(e->Message );
}
catch(TimeoutException^ e){
SetText(e->Message );
}
catch(Exception^ e){
SetText(e->Message );
}
}
解決のヒントは
MSDNフォーラム(日本語)
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1098118&SiteID=7
で、「BeginInvokeを使う」と書いてあったのを素直に実行してみました。
BeginInvokeの書式は
http://msdn2.microsoft.com/ja-jp/library/a06c0dc2(VS.80).aspx
にあるとおり、Invokeと同じでしたので、 InvokeをBeginInvokeに差し替えただけで、serialPort1->Close(); 実行時のフリーズが発生しなくなりました。(変更前は9割以上の確率でフリーズしていました。)
以上、前回の質問
http://vsug.jp/tabid/63/forumid/46/postid/9978/view/topic/Default.aspx
は解決したようで実は解決していなかったが、BeginInvokeで解決できた、という報告でした。
お騒がせました。m(_ _)m