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
となりました(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; }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/05 01:07