在异步下载期间,在C#WPF应用程序中阻止了UI线程

时间:2014-01-02 18:35:37

标签: c# wpf async-await

我有以下基本的WPF应用程序,我想要在文本框中显示内容。但是,当我单击按钮时,UI线程似乎正在阻塞。我不确定我做错了什么,因为我从Pluralsight课程的练习文件中抓取了这段代码。

XAML和代码:

<Window x:Class="AsyncFetch.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Button
            x:Name="getButton"
            HorizontalAlignment="Left"
            Width="75"
            Content="_Get Data"
            Click="getButton_Click"
            />

        <TextBox
            x:Name="dataTextBox"
            Margin="4"
            Grid.Row="1"
            />

    </Grid>
</Window>

代码:

namespace AsyncFetch
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void getButton_Click(object sender, RoutedEventArgs e)
        {
            WebClient w = new WebClient();

            string txt = await w.DownloadStringTaskAsync("http://www.google.com");
            dataTextBox.Text = txt;
        }
    }
}

1 个答案:

答案 0 :(得分:6)

这不应该阻止UI线程,技术是正确的。

但是,仅仅因为方法是Async并返回Task<T>,并不保证整个方法(或其中任何一个)将异步运行。

WebClient的情况下,在完全准备并启动请求之前,控件不会返回给调用者。使用WebClient,我相信URI准备(包括所有DNS查找)可以同步发生,并且在异步部分(实际请求)开始之前是必需的,这可能会在请求返回之前导致延迟。