お疲れ様です。たなしょです。
今日でスラスラわかるC#も読み終わります。
非同期処理を勉強しました。今日も記事の内容は短いです。
マルチスレッドプログラミング
複数の処理を並行して行うことをマルチスレッドプログラミングといいます。
C#では非同期メソッド
とlockステートメント
の2つの言語機能を持っている。
非同期メソッド
メインスレッド以外処理を実行することです。
JavaScriptと同じようにasync
、await
で記述されます。
async
asynkキーワードは通常のメソッドと挙動が変わりません。awaitと呼ぶ際にペアで必要です。
await
awaitキーワードは別スレッドに制御を移して、処理完了後に続きの処理を再開します。
排他制御
マルチスレッドプログラミングでは競合状態はよく起こるので、ほかのスレッドが同じ場所を実行しないように排除する処理のことを排他制御と呼びます。
C#の排他制御のための構文でlockステートメント
を持っています。
排他制御に入る前に対象のオブジェクトにロックをかけて、ロック部分の処理が終わったらロックが解除されて、待っていた処理が再開されます。
一連の処理を排他ロック
といいます。
lockステートメントを使った処理は以下のようになります。
countがNになるまでその部分にロックをかけてNまで到達したらロックを解除して。Console.WriteLineでコンソール画面に文字列を出力させます。
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
const int N = 1000000;
var count = 0;
var sysncObject = new object();
Parallel.For(0, N, i =>
{
lock (sysncObject)
{
var tmp = count;
count = tmp + 1;
}
});
Console.WriteLine($"count: {count}, N: {N}");
}
}
最後に
非同期処理って厄介なイメージが自分の中ではありますね。
JavaScriptで処理を書いてた時も仕組みを理解していなかったのもすごく苦労した記憶があります。
今日は非同期処理の内容を再確認できて勉強になりました。
入門書は読み終わったので、明日からVisual C#アプリを作成していきます。
今のところ当初予定していた進捗通りで進んでいるので一安心です。
久しぶりに技術書を駆け足ではありますが1冊通して読みました。疲れたー。