在網路上看到了 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;
}
}
與 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;
}
}
async 與DoEvents 比較的重點:
- 程式在 async 結束前就能繼續執行
- 程式在 DoEvents 結束後才能繼續執行
參考:
留言列表