簡體   English   中英

WinForms UI:使用異步/等待和ADO.NET

[英]WinForms UI : Using async / await and ADO.NET

我正在嘗試在WinForms中學習async await在其中單擊按鈕,我有

private async void btnSearch_Click(object sender, EventArgs e)
{   
    lblSearchStatus.Text = "Searching...";

    await FetchFirstNames();
    lblSearchStatus.Text = "searching for First Name";
    await FetchLastNames();
    lblSearchStatus.Text = "searching for Last Name";   
}

我正在用兩種希望asynchronously調用的方法搜索FirstNamesLastNames 兩種方法相似,代碼如下所示:

private async Task FetchFirstNames()
{
    ...
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);       
        SqlDataAdapter dap = new SqlDataAdapter(command);
        DataTable tblMatches = new DataTable();
        await Task.Run(() =>dap.Fill(tblMatches)); //it takes about 5s to complete.                 
        ...
        lblSearchStatus.Text = tblMatches.Rows.Count.ToString() + " first names found.";        
    }
}

單擊按鈕時,我的意圖是lblSearchStatus的文本應從“正在搜索...” ---> “正在搜索名字” ---> “正在搜索姓氏” ---> “ 123名字/姓氏”找到名字”。 但是,當我運行它時,標簽直接從“正在搜索..”更改 “找到的123個姓氏/名字”。
我要去哪里錯了?

這有點晚了,但可能會幫助其他人尋找答案:我還不能100%確定,但是好像UI線程被阻塞了,因此標簽沒有被刷新,如果我們使用“ Task.Run ”,它將使用另一個線程來運行資源密集型進程。

private async void button1_Click(object sender, EventArgs e)
{
    lblSearchStatus.Text = "searching for First Name--";

    Task task1 = Task.Run(() => FetchFirstNames());
    await task1;

    lblSearchStatus.Text = lblSearchStatus.Text + " searching for Last Name-";
    Task task2 = Task.Run(() => FetchLastNames());
    await task2;

    lblSearchStatus.Text = lblSearchStatus.Text + " ---- All Done ----";
}

private async Task FetchFirstNames()
{
    string str1 = "";

    lblSearchStatus.Text = lblSearchStatus.Text + " Start first name -";

    for (int i = 0; i < 100000000; i++)
    {
        str1 = i.ToString();
    }

    lblSearchStatus.Text = lblSearchStatus.Text + " first name: i=" + str1;
}

private async Task FetchLastNames()
{
    string str1 = "";

    lblSearchStatus.Text = lblSearchStatus.Text + " Start Last name -";

    for (int i = 0; i < 100000000; i++)
    {
        str1 = i.ToString();
    }

    lblSearchStatus.Text = lblSearchStatus.Text + " last name: i=" + str1;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM