■13483 / inTopicNo.12) |
Re[10]: VB.NETマルチスレッドの名前指定と終了 |
□投稿者/ 七曜 (57回)-(2008/01/30(Wed) 05:21:05)
|
■No13480 (モー さん) に返信
>なちゃ さんのおっしゃっているのはAbort()自体に信頼性がない不確実なメソッドだということですか?
[スレッドの破棄]
http://msdn2.microsoft.com/ja-jp/library/cyayh29d(vs.80).aspx
に書いてありますが、
Abort() -> 終了処理 -> 制御が戻る
ではないので、
Abort() -> 終了命令(とでもしておきましょう) -> 制御が戻る
で、Abortされた側のスレッドは、終了処理をしてから停止するので
場合(実装の仕方)によっては、終了しない場合もあり得るということになるかな。
簡単なサンプル書いてみました。ThreadFuncYはAbort()後も動いている事が確認出来るかと。
Private dicThreads As New Dictionary(Of String, Thread)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim thread As Thread
thread = New Thread(New ThreadStart(AddressOf ThreadFuncX))
thread.Start()
dicThreads.Add("X", thread)
thread = New Thread(New ThreadStart(AddressOf ThreadFuncY))
thread.Start()
dicThreads.Add("Y", thread)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim KVP As KeyValuePair(Of String, Thread)
For Each KVP In dicThreads
Console.WriteLine("{0} Abort!:{1}", KVP.Key, DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"))
KVP.Value.Abort()
Next
End Sub
Private Sub ThreadFuncX()
While (True)
Try
Thread.Sleep(3000)
Console.WriteLine("ThreadFuncX execuing!:{0}", DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"))
Catch ex As ThreadAbortException
Continue While
End Try
End While
End Sub
Private Sub ThreadFuncY()
Try
While (True)
Thread.Sleep(3000)
Console.WriteLine("ThreadFuncY execuing!:{0}", DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"))
End While
Catch ex As ThreadAbortException
While (True)
Thread.Sleep(3000)
Console.WriteLine("ThreadFuncY(2) execuing!:{0}", DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"))
End While
End Try
End Sub
|
|