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