- ふらっと C#,C♯,C#(初心者用) Part117 [転載禁止]©2ch.net
151 :デフォルトの名無しさん[sage]:2015/10/12(月) 15:51:43.51 ID:wjSQdsNO - 用途によるだろうけど、普通は、ジェネリック対応のクラスだけで間に合う。
| - ふらっと C#,C♯,C#(初心者用) Part117 [転載禁止]©2ch.net
159 :デフォルトの名無しさん[sage]:2015/10/12(月) 19:08:20.89 ID:wjSQdsNO - >>149
なんでTaskの中でTask作ってんの? 継続タスクにしたいなら、ContinueWithでつなげれば良いだろう。 あと、そのケースなら Task.Factory.StartNewじゃなくて Task.Runを使ったほうがすっきりするだろう。 ちなみにTaskのDispose()は、無理に呼ぶ必要はない。むしろ無闇に呼び出したらタイミングによっては、厄介なことになる。 >>158 CancellationTokenSourceは、一度限り、再度使いたいならCancellationTokenSourceを作り直すしかない。 キャンセルされてたら、tokenSource.Token.ThrowIfCancellationRequested()が例外を吐いて強制終了するだけなんで ボタンが復帰しないのは当然のこと。
| - ふらっと C#,C♯,C#(初心者用) Part117 [転載禁止]©2ch.net
161 :デフォルトの名無しさん[sage]:2015/10/12(月) 19:51:26.84 ID:wjSQdsNO - >>160 たぶんやりたいことは、こんなところか。
private CancellationTokenSource cancelSource; private void button1_Click( object sender , EventArgs e ) { if( this.cancelSource != null ) this.cancelSource.Cancel(); // まだキャンセルされてなければキャンセル要求 this.button1.Enabled = false; this.cancelSource = new CancellationTokenSource(); var token = this.cancelSource.Token; Task.Factory.StartNew( () =>{ for( int i = 0; i < 100000; i++ ){ token.ThrowIfCancellationRequested(); Thread.Sleep( 100 ); } } , token ) .ContinueWith( task => { // 継続タスク(UIスレッドに切り替わって実行される) // キャンセルされようとも正常に完了しようとも、例外が発生しても実行される。 this.button1.Enabled = true; } , TaskScheduler.FromCurrentSynchronizationContext() ); } private void button2_Click( object sender , EventArgs e ) { if( this.cancelSource != null ) { this.cancelSource.Cancel(); // キャンセル要求 this.cancelSource = null; } }
|
|