在網路上看到了 async & await ,想說,WinForm 有 Application.DoEvents() ,那有甚麼差別

於是把它用在了WinForm 結果卻出現

好吧...

看來 async 在WinForm 上也會遇到跟 Thread 一樣的問題

看了微軟的Doc,

async 是被設計在Web存取、檔案處理、影像處理上,

為了讓非同步方法比較容易賺寫,

為了設計給只會用單一執行緒撰寫UI 的程式設計師。

目的看起來與Application.DoEvents() 是相同的,

為了避免等待程式處理結束前,整個系統都被程序封鎖而沒有回應。

 

async重點:

  • 要非同步的函式要加 async
  • 使用非同步函式前面要加 await
  • 用 await 呼叫的函式中不能有WinForm元件

 

    public partial class Form1 : Form
    {
        public bool bTest = false;
        public Form1()
        {
            InitializeComponent();
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            bTest = true;
            Method1();            
            textBox1.Text = "After Method1.";
        }

        public async void Method1()
        {            
            textBox1.Text = "Method1 Executing...";
            await Task.Run((Action)Method2);
            textBox1.Text = "Method1 Execute Finish.";
        }

        public void Method2()
        {
            int index = 0;
            while (bTest)
            {
                index++;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            bTest = false;
        }
    }

 

async範例下載

 

與 Application.DoEvents 相較之下,

功能略有所不同,

 

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool bTest;
        private void button1_Click(object sender, EventArgs e)
        {
            bTest = true;
            textBox1.Text = "Method1 Executing...";
            button1.Enabled = false;
            while (true)
            {
                if (!bTest) break;
                Application.DoEvents();
            }
            button1.Enabled = true;
            textBox1.Text = "Method1 Execute Finish.";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            bTest = false;
        }
    }

DoEvent範例下載

 

async 與DoEvents 比較的重點:

  • 程式在 async 結束前就能繼續執行
  • 程式在 DoEvents 結束後才能繼續執行

 

參考:

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 史克威爾凱特 的頭像
    史克威爾凱特

    史克威爾凱特的部落格

    史克威爾凱特 發表在 痞客邦 留言(0) 人氣()