非同步學習小例子

若白过隙發表於2024-11-15
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  .....");
        }    

  

相關文章