質問編集履歴

1 実行環境

vc3000

vc3000 score 191

2016/10/05 06:03  投稿

C# await以降が実行されるスレッドについて
async / awaitについて勉強中で、コード内のどの部分がどのスレッドで実行されるのか`CurrentThread.ManagedThreadId`で確認してみました。
```
using System;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
public class DisplayThreadId
{
   public static void Main()
   { 
       int threadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
       System.Console.WriteLine($"Main 1: id = {threadId}  // 1");
       var x = Hoge();
       x.Wait();
       System.Console.WriteLine($"ret = {x.Result}");
       threadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
       System.Console.WriteLine($"Main 2: id = {threadId}  // 1");
   } 
   private static async Task<string> Hoge()
   { 
       int threadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
       System.Console.WriteLine($"Hoge 1: id = {threadId}  // 1");
       await Task.Delay(100);
       threadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
       System.Console.WriteLine($"Hoge 2: id = {threadId}  // 5");
       return "hondarake";
   } 
}
```
実行結果は
```
Main 1: id = 1  // 1
Hoge 1: id = 1  // 1
Hoge 2: id = 5  // 5
ret = hondarake
Main 2: id = 1  // 1
```
となりました(実行環境はLinux/Monoです)。
となりました(Visual Studio Community 2015とLinux/Monoで確認)。
`Hoge 2`の部分は`id = 1`になるだろうと予想したのですが、違っていました。
await以降の部分が元スレッドとは違うスレッドで実行されるとなると、例えば下記のようなコードで`this.button.IsEnabled = true;`の部分がUIスレッドでないスレッドで実行されることになり、エラーになってしまうと思うのですが、多分違うのですよね。ちょっと混乱しています。この辺り教えていただけますでしょうか?
```
private async void Button_Click(object sender, RoutedEventArgs e)
{
   this.button.IsEnabled = false;
   await HeavyWork();   //--- 何か重たい処理
   this.button.IsEnabled = true;
}
```
  • C#

    12544 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る