异步/等待无法正常工作

时间:2015-11-05 14:17:57

标签: c# multithreading asynchronous

我已经编写了一个示例.net win表单应用程序来学习 async / await concept。

我的示例获胜表格有2个按钮[button1,button2],以及下方 是两者的点击事件处理程序。

private async void button1_Click(object sender, EventArgs e)
{            
  string str = await BL.LongRunningOperation();
  MessageBox.Show(str); 
}

private void button2_Click(object sender, EventArgs e)
{
  MessageBox.Show("Any Time");
}

下面是长时间运行的操作,它在click事件上被调用 button1

public class BL
{

    public  static async Task<string> LongRunningOperation()
    {
        string strReturnValue = "Long Running Operation";

        int i = 0;

        while (i <= 1000000000)
        {
            i++;
        }

        return strReturnValue;
    }
}

我的假设是用户点击了长时间运行的Button1 操作将异步执行,同时也是用户执行 可以点击button2。

但我观察到的是,用户只能点击button2一次 长时间运行完成。

请让我知道需要修改哪些内容才能使此调用异步。

2 个答案:

答案 0 :(得分:6)

您的LongRunningOperation实际上并没有异步执行任何操作,因此它不会在另一个线程上运行并返回到单击处理程序。应该有一个编译器警告,因为async方法中没有await

正如其他答案所建议的那样,写下你的点击处理程序:

private async void button1_Click(object sender, EventArgs e)
{            
  string str = await Task.Run(() => BL.LongRunningOperation());
  MessageBox.Show(str); 
}

答案 1 :(得分:3)

因为您的示例是同步执行,因此您可以尝试将长时间运行的操作体包装在

<TextBox Text="{Binding PageContent, UpdateSourceTrigger=PropertyChanged}" />