「C Sharpの基礎 - マルチスレッド」の版間の差分

ナビゲーションに移動 検索に移動
文字列「<source lang」を「<syntaxhighlight lang」に置換
(文字列「<source lang」を「<syntaxhighlight lang」に置換)
9行目: 9行目:
<br>
<br>
下記の例は、Task<int>型を返す非同期関数である。<br>
下記の例は、Task<int>型を返す非同期関数である。<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  public async Task<int> MethodAsync()
  public async Task<int> MethodAsync()
  {
  {
25行目: 25行目:
Taskは、一連の処理をひとまとまりにした単位である。<br>
Taskは、一連の処理をひとまとまりにした単位である。<br>
Taskを呼び出した際はマルチスレッドで実行されるようになっており、連続で記述する場合は、記述した個数だけマルチスレッドで並列処理される。<br>
Taskを呼び出した際はマルチスレッドで実行されるようになっており、連続で記述する場合は、記述した個数だけマルチスレッドで並列処理される。<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  public async Task MethodAsync()
  public async Task MethodAsync()
  {
  {
54行目: 54行目:
2つ以上のスレッドを実行して全スレッドの処理が終了した後、続けてスレッドの処理を書く場合は、<br>
2つ以上のスレッドを実行して全スレッドの処理が終了した後、続けてスレッドの処理を書く場合は、<br>
ContinueWithまたはawaitを使用してスレッドの終了を待つ。<br>
ContinueWithまたはawaitを使用してスレッドの終了を待つ。<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  // パターン1
  // パターン1
  var task1 = Task.Run(() =>
  var task1 = Task.Run(() =>
74行目: 74行目:
  </source>
  </source>
<br>
<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  // パターン2
  // パターン2
  var task1 = Task.Run(() =>
  var task1 = Task.Run(() =>
110行目: 110行目:
処理を続けることができないからである。<br>
処理を続けることができないからである。<br>
その結果、親スレッドは子スレッドを待ち続け、子スレッドは親スレッドに戻ろうとして、デッドロックが発生する。<br>
その結果、親スレッドは子スレッドを待ち続け、子スレッドは親スレッドに戻ろうとして、デッドロックが発生する。<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  // デッドロックが起きるサンプルコード(GUIアプリケーションのみ)
  // デッドロックが起きるサンプルコード(GUIアプリケーションのみ)
  // コンソールアプリケーションでは正常に動作する
  // コンソールアプリケーションでは正常に動作する
125行目: 125行目:
<br>
<br>
対策として、以下のように記述するとデッドロックが回避できる。(戻るスレッドはどこでもよい場合)<br>
対策として、以下のように記述するとデッドロックが回避できる。(戻るスレッドはどこでもよい場合)<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  // デッドロックが起きないサンプルコード(GUIアプリケーションのみ)
  // デッドロックが起きないサンプルコード(GUIアプリケーションのみ)
  public void callMethod()
  public void callMethod()

案内メニュー