Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
スレッドの意図的な強制終了について。
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30308#CommentId83154
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
YuO
 (社会人)
投稿日時
2017/12/1 14:02:09
> ・Threading.ThreadのスレッドにはAbortメソッドがあるのに対して、Taskには強制終了の手段がない、という認識はあっていますか?
あっています。
> そもそもスレッドを強制終了する事が非推奨なため、そういった機能を排除したのですか?
> もしスレッドの強制終了が非推奨なのであれば、その理由も知りたいです。
強制終了がどのタイミングで行われているのか,外部からはわからないので,通常外部からの強制終了は推奨されません。
通常,オブジェクトの内部状態は整合性が保たれています。
これが破られるのはオブジェクトのメソッドを呼び出している最中になります。
この呼び出しの最中に強制終了されると,内部状態が不整合であるオブジェクトができてしまいます。
このような状況を起こさないように,スレッドを外部から強制終了することは,大抵のシステムにおいてできないか推奨されません。
> また、Taskの中身はスレッドプールである、という記事を読んだことがあります。
> これはThreading.ThreadPoolを指しているのでしょうか?それとも、スレッドを使いまわしているというだけで全く別物ですか?
Task自体は非同期動作のカプセル化です。
非同期I/Oなどではスレッドをほぼ利用しませんし,TaskCompletionSourceを利用すると状態の遷移自体を自分で書くことが出来ます。
で,Task.Runなどがスレッドプールを使う,というのは単純にThreadSchedular.DefaultがThreadPoolTaskScheduler,ということでしょう。
実装を読むと,TaskCreationOptions.LongRunningが付いていない場合はThreadPoolを使っています。
see)
https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/threading/Tasks/TaskScheduler.cs#L288
https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/threading/Tasks/ThreadPoolTaskScheduler.cs