2019-10-01から1ヶ月間の記事一覧

デリゲート

C#

概要 デリゲートはメソッドなどの処理自体を持つことができる型です。 デリゲート型のインスタンスに処理を登録し、そのインスタンスを経由することでどこからでも処理を呼び出すことができます。 Action・Func・EventHandlerなどのデリゲート型が用意されて…

イベント

C#

概要 任意インスタンスからのイベント発行を、他インスタンスで購読し、それをトリガーに処理を動かすことができます。 イベントの定義 eventキーワードを用いて定義します。 public event EventHandler HogeEvent; eventキーワードとともに指定する型はデリ…

Task④

C#

タスクのキャンセル タスクに渡したラムダ式内でOperationCanceledExceptionをスローすることでタスクをキャンセルできます。 キャンセルされたタスクのTask.StatusはCanceledになります。 var task = Task.Run(() => throw new OperationCanceledException(…

マルチスレッドの管理①

C#

排他制御 スレッドセーフでないオブジェクトに対して複数スレッドからアクセスした場合、競合が発生します。 例えば、コレクションへの追加中に、他スレッドからは削除が行われた場合、追加結果が期待値と異なってしまうといった状況です。 追加処理に排他制…

Task③

C#

async/await await メソッド内でTaskの実行を非同期的に待機する場合、awaitキーワードを付与します。 var task = Task.Run(() => hoge((); await task; awaitした時点で、メソッドは待機状態となり、呼び出し元に処理が戻ります。 taskが完了するとメソッド…

Thread②

C#

スレッドの基本② ThreadStatic/ThreadLocal 以下2つの方法で、アクセスするスレッド毎にフィールド/変数に異なる値を持つことができます。 staticフィールドに対してThreadStatic属性を付与する [TheadStatic] private static int hoge; ThreadLocal型のフィ…

Thread①

C#

スレッドの基本① スレッドの作成 コンストラクターにラムダ式を渡して生成します。 var thread = new Thread(() => hoge()); ラムダ式に引数を与えることもできます。 単一の引数のみ許容し、object型として扱われます。 var thread = new Thread(hoge => fu…

Task②

C#

Taskの基本② 継続タスク 子タスク Taskの基本② 継続タスク Task.ContinueWith()を使用することで、後続タスクを登録できます。 後続タスクは先行タスクを受けるAction/ラムダ式を引数にします。 先行タスクに戻り値がある場合、Resultから取得できます。 継…

Task①

C#

Taskの基本① Taskの作成/開始 Taskの待機 Taskの戻り値 Taskの基本① Taskの作成/開始 以下コードでタスクを作成/開始できます。 var task = new Task(() => hoge()); task.Start(); 以下のように①行で書くこともできます。 var task = Task.Run(() => hoge()…

並列処理について③(PLINQ)

C#

PLINQ ParallelEnumerable.AsParallel() 並列実行方法のコントロール 例外 PLINQ ParallelEnumerable.AsParallel() AsParallel()を使用することで、LINQのクエリを並列実行することができる。 ただし、必ずしも並列実行されるわけでなく、AsParallel()にてパ…

並列処理について②(Parallel.For/ForEachの管理)

C#

ParallelLoopState ParallelLoopState.Stop() ParallelLoopState.Break() ParallelLoopResult ParallelLoopState Prallel.For/ForEachにわたすAction/ラムダ式は、ParallelLoopStateを引数とするものも指定可能です。 ParallelLoopState.Stop()/Break()によ…