.NET Framework

CancellationTokenSource

Taskをキャンセルできるようにする仕組みを作るには、CancellationTokenが必要。 まずは、CancellationTokenSourceを生成する。CancellationTokenSource クラス (System.Threading) | Microsoft DocsMainClass.csで、まずは、CancellationTokenSourceを生成…

Task.Wait

Task.Waitで、そのタスクが完了するまで待つ。Task.Wait メソッド (System.Threading.Tasks) | Microsoft DocsMainClass.csで、とすると、 t.Wait()で待ち状態に入った後、タスクの処理がすべて完了してから、"Finish after"が出力されてる。t.Wait()で待ち…

Task.Status

タスクの状態は、Task.Statusで確認することもできる。Task.Status プロパティ (System.Threading.Tasks) | Microsoft DocsMainClass.csで、前回と同様に3秒ごとに確認。 今回は、Task.Statusを出力するだけ。 途中Runningだったのが、最後RanToCompletionに…

Task.IsCompleted

タスクが完了したかどうかは、Task.IsCompletedでわかる。Task.IsCompleted プロパティ (System.Threading.Tasks) | Microsoft DocsMainClass.csで、3秒後に確認し、さらにその3秒後にまた確認する。 1回目はまだだったが、2回目は完了を確認した。1回目はま…

SynchronizationContext.SetSynchronizationContext

WinFormsの場合、TaskScheduler.FromCurrentSynchronizationContextで、同期コンテキストに基づいたタスクスケジューラを取得して、それを使うことで、継続タスクをUIスレッドで実行できた。 では、コンソールアプリの場合はどうか。 // 名前空間の登録 usin…

Task.ContinueWith(continuationAction,scheduler)

Task.ContinueWithに、継続タスクに加えて、タスクスケジューラも渡せる。Task.ContinueWith メソッド (System.Threading.Tasks) | Microsoft DocsForm1.csで、こうすると、 継続タスクのスレッドIDが、タスクの外のスレッドIDと同じになる。継続タスクのス…

TaskScheduler.Current

TaskScheduler.FromCurrentSynchronizationContextで取得したschedulerを、Task.Startに渡した時に、TaskScheduler.DefaultとTaskScheduler.Currentがどうなっているか確認する。TaskScheduler.Current プロパティ (System.Threading.Tasks) | Microsoft Doc…

Task.Start(scheduler)

Task.Startにタスクスケジューラを渡せる。Task.Start メソッド (System.Threading.Tasks) | Microsoft DocsTaskScheduler.FromCurrentSynchronizationContextで取得したschedulerを、Task.Startに渡すとどうなるか。このように書く。 実行してbutton1を押す…

TaskScheduler.FromCurrentSynchronizationContext

TaskScheduler.FromCurrentSynchronizationContextで、現在の同期コンテキストに紐付いたタスクスケジューラを生成できる。TaskScheduler.FromCurrentSynchronizationContext メソッド (System.Threading.Tasks) | Microsoft DocsForm1.csで、と書く。 butto…

Task.Start

既にやってるけど、Task.Startでタスクを開始するという場合もある。Task.Start メソッド (System.Threading.Tasks) | Microsoft DocsコンソールアプリでTask.Startはやってるけど、WinFormsでTask.Startした場合に、Taskの外と中で、現在のタスクスケジュー…

Debug.Print

Debug.Printで、書式を指定して、デバッグ出力。Debug.Print メソッド (System.Diagnostics) | Microsoft DocsConsole.WriteLineと違って、Debug.WriteLineは書式を指定できないので、これを使う。"{}"の中に、文字列は順番だけ、整数値はDを付けて、Nは数値…

Debug.WriteLine

Debug.WriteLineで、デバッグ出力し、改行もする。Debug.WriteLine メソッド (System.Diagnostics) | Microsoft DocsConsole.WriteLineと違うのは、書式指定が出来ない事と、 Console.WriteLineでは、引数無しオーバーロードで改行できたが、Debug.WriteLine…

Debug.Write

Debug.Writeで、改行無しデバッグ出力。Debug.Write メソッド (System.Diagnostics) | Microsoft DocsForm1.csは、1つ目は、変数の値をデバッグ出力し、改行が無いので、改行文字も出力してる。 2つ目は、それぞれの型のリテラルをデバッグ出力、改行。 Debu…

Debug

コンソールアプリなら、ConsoleのWriteやWriteLineでプリントデバッグが可能だが、WinFormsなどのGUIアプリはそうはいかない。 Debugクラスの各メソッドを使うと、デバッグ実行時の出力画面でプリントデバッグできる。Debug クラス (System.Diagnostics) | M…

SynchronizationContext.Current

WinForms(Windowsフォームアプリケーション)の場合、SynchronizationContext.Currentはどうなるか。SynchronizationContext.Current プロパティ (System.Threading) | Microsoft DocsWinFormsのプロジェクト久しぶり過ぎて、 アンダースコア('_')付けないと…

SynchronizationContext

スレッド間の同期に関する情報を持っているのが、同期コンテキスト(SynchronizationContext)。 WinFormsなどで、Taskなどを使って処理をUIスレッドからワーカースレッドに切り替えた後に再びUIスレッドに戻ることが出来るのはこれのおかげらしい。Synchroniz…

Task<TResult>.Result

実は、Task<TResult>.Resultは、結果が確定するまでそのスレッドを止めて待っていてくれる。https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task-1.result?view=netframework-4.0なので、Thread.Sleepで待つ必要はない。これで実行すると、 Fun</tresult>…

Task<TResult>

Task.Factory.StartNewに指定したラムダ式で値TResultを返すと、Task<TResult>オブジェクトが返ってくる。https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task-1?view=netcore-3.1これには、非同期処理の戻り値や状態が格納されている。 MainCl</tresult>…

Task.ContinueWith

Task.ContinueWithで、完了した時に実行する継続タスクを指定する。Task.ContinueWith メソッド (System.Threading.Tasks) | Microsoft Docs [雑記] スレッド プールとタスク - C# によるプログラミング入門 | ++C++; // 未確認飛行 CMainClass.csで、t.Cont…

Thread.ManagedThreadId

Thread.ManagedThreadIdに、スレッドIDが格納されている。Thread.ManagedThreadId プロパティ (System.Threading) | Microsoft DocsメインスレッドとワーカースレッドのIDを確認する。 ThreadFunc Thread ID: 3 Main Thread ID: 1 ThreadFunc Thread ID: 3 M…

List<T>.ForEach

List<T>にすると、ForEachで各要素に対して、引数のAction<T>を実行できる。 (EnumerableにはForEachがないので注意。)https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1.foreach?view=netcore-3.1foreachが無くても、それぞれの要</t></t>…

Enumerable.ToList

Listに変換するには、ToListを使う。https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.tolist?view=netcore-3.1ToArrayをToListにして、受け取り側をList<string>にするだけ。 Taro Saburo Goro 続行するには何かキーを押してください . . .変わ</string>…

Enumerable.ToArray

配列に変換するには、ToArrayを使う。https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.toarray?view=netcore-3.1名前に戻して、string配列を受け取るようにする。 Taro Saburo Goro 続行するには何かキーを押してください . . .文字列…

Enumerable.Select

絞り込まれた要素(行, Row)のどの値(列, Column)を返すかは、Selectで指定する。Enumerable.Select メソッド (System.Linq) | Microsoft Docs今回は、170以上のボディの年齢を返す。とすると、 30 25 17 続行するには何かキーを押してください . . .となる。…

Enumerable.Where

LINQで条件を絞り込むには、Whereを使う。Enumerable.Where メソッド (System.Linq) | Microsoft Docs空プロ空プロ。MainClass.csMainClass.csBody.csBody.csSystem.Coreを参照に追加System.Coreを参照に追加。Body.csは、LINQの項と同じ。MainClass.csは、b…

Thread.CurrentThread

Thread.CurrentThreadは、現在のスレッドオブジェクトを返すスタティックメソッド。Thread.CurrentThread プロパティ (System.Threading) | Microsoft DocsデリゲートとBeginInvokeなどを使った非同期処理において、UIスレッドとワーカースレッドが違うスレ…

TaskScheduler.Default

TaskScheduler.Defaultは、デフォルトのTaskSchedulerインスタンスを持つ。TaskScheduler.Default プロパティ (System.Threading.Tasks) | Microsoft DocsTaskScheduler.Currentと同じかどうか確かめる。実行すると、 Default: System.Threading.Tasks.Threa…

TaskScheduler

TaskSchedulerが、複数あるタスクをどのように実行していくか管理している。TaskScheduler クラス (System.Threading.Tasks) | Microsoft Docs TaskScheduler クラスまず、そのプログラムの現在のタスクスケジューラが何かを出力する。現在のタスクスケジュ…

TaskFactory.StartNew

TaskFactory.StartNewでタスクを実行する。TaskFactory.StartNew メソッド (System.Threading.Tasks) | Microsoft Docsたくさんオーバーライドメソッドがあるが、Actionだけのメソッドと同じ意味の引数を指定したメソッドで実行してみる。C# 非同期、覚え書…

TaskFactory

TaskFactoryでタスクの生成や実行順などの操作ができる。TaskFactory クラス (System.Threading.Tasks) | Microsoft DocsStartNew以外の他のメソッドを扱おうにも、この段階では1つずつ説明しないと難しそうなので、今回は、いったんインスタンスを受け取っ…