繁体   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