void Test1() { ChangeText("=========================================================="); ChangeText("i am washing left now ..."); } // 執行Test 方法為 Test執行緒 async void Test() { await playGameAsync(); // Main 執行緒遇到 await, 會拆分出 Test執行緒. 此時, Main執行緒回撥到Main方法,Test執行緒繼續執行 playGameAsync()方法 ChangeText("=========================================================="); ChangeText("i am washing right now ..."); } // 執行 playGameAsync 為 play執行緒 async Task playGameAsync() { await Task.Run(() => { // Test 執行緒來這也會拆分兩個執行緒(但是play執行緒回撥時因為自己被await修飾了, 所以不能像Main執行緒一樣立即向下執行),需要等待 play執行緒執行完成 Task.Delay(3000).Wait(); ChangeText("I am play game .."); }); Task.Delay(3000).Wait(); ChangeText("i am finish play game"); } void ChangeText(string txt) { // 安全地更新Label的文字 if (textBox1.InvokeRequired) { textBox1.Invoke(new Action(() => { textBox1.Text += txt + "\r\n"; })); } else { textBox1.Text += txt + "\r\n"; } } private void button1_Click(object sender, EventArgs e) { Test(); // Main執行緒進入其中 Test1(); ChangeText("This is Main Finish ....."); }