【问题标题】:My window doesnt remain active after i click on "async" method button单击“异步”方法按钮后,我的窗口没有保持活动状态
【发布时间】:2012-10-23 17:11:03
【问题描述】:

我有以下代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        this.Background = Brushes.Red;
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        int res = WaitFiveSecMethod();
        this.text2.Text = res.ToString();
    }

    private int WaitFiveSecMethod()
    {
        Thread.Sleep(5000);
        return 5;
    }

    private async void Button_Click_3(object sender, RoutedEventArgs e)
    {
        var res = await WaitFiveSecMethodAsync();
        this.text1.Text = res;

    }

    private async Task<string> WaitFiveSecMethodAsync()
    {
        Thread.Sleep(5000);
        return "5";
    }

}

我想说明单击“同步”按钮(按钮 2)和单击“异步”按钮(按钮 3)之间的区别。单击两个按钮应该执行相同的耗时计算(在我的例子中,用“Thread.Sleep(5000)”表示)。 目前使用异步和等待让我的客户卡住我认为这些关键字不应该阻塞我的客户线程。 我做错了什么?

【问题讨论】:

    标签: c# wpf async-await


    【解决方案1】:

    您的以下代码同步工作并阻止 UI,而不是异步:

    private async Task<string> WaitFiveSecMethodAsync()
    {
        Thread.Sleep(5000);
        return "5";
    }
    

    记住 async 只负责启用await 关键字,如果你没有awaitasync 没有意义并转向同步。所以,async 方法内部必须至少有一个await 关键字。

    更好的方法是,您应该 延迟 等待 Task.Delay 不会阻塞您的 UI 线程:

    private async Task<string> WaitFiveSecMethodAsync() 
    { 
        await Task.Delay(5000); 
        return "5"; 
    } 
    

    【讨论】:

    • 但我想演示一个不会卡住客户端的长计算..如果我正在使用 task.delay 我已经开始一个新线程..那么 async ans await 的用途是什么?跨度>
    • 但我想展示执行相同操作的异步和同步方法之间的区别。如果我将使用 Task.Delay 它不会将客户端卡在同步方法中,因为我正在用它盯着一个新线程......那么 await 和 async 的用途是什么?
    • 不太了解你,你的问题有什么意义?你说我不能让它异步,当我点击“按钮3”时,客户端卡住了
    • 那么,在每个异步流程结束时,我需要一些支持异步的系统方法吗?我以为我可以自己制作异步方法...可以说:用在同一踏板上的耗时计算替换 Task.Delay...
    • @OriPrice:您可以使用Task.Run 轻松地将耗时的计算放在线程池线程上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多