2012年11月21日水曜日

非同期でWebページを取得する2

非同期でWebページを取得する」の改良版です。
タスクの終了だけわかればよく、途中の進捗を通知する必要がない場合、通知用のクラス(Messageクラス)を作る必要はありません。
Task.ContinueWithメソッドの第二引数にUIスレッドのタスクスケジューラを指定して、処理結果を画面に表示する処理をUIスレッドで動作させます。
UIスレッドのタスクスケジューラは、TaskScheduler.FromCurrentSynchronizationContext()で取得できます。



MainWindow.xaml

<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="250" Width="425">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <DockPanel Grid.Row="0" LastChildFill="True">
            <Button DockPanel.Dock="Right" Click="cancelButton_Click">×</Button>
            <Button DockPanel.Dock="Right" Click="Button_Click">Get</Button>
            <TextBox DockPanel.Dock="Right" Name="urlTextBox" />
        </DockPanel>
        <TextBox Grid.Row="1" Name="contentTextBox" 
                 ScrollViewer.HorizontalScrollBarVisibility="Auto"
                 ScrollViewer.VerticalScrollBarVisibility="Auto" />
        <StatusBar Grid.Row="2">
            <TextBlock Name="logTextBlock" />
        </StatusBar>
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Net.Http;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApplication6
{
    public partial class MainWindow : Window
    {
        private HttpClient client = new HttpClient();

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.client.CancelPendingRequests();
            string url = this.urlTextBox.Text;
            this.logTextBlock.Text = "取得中";
            this.client.GetStringAsync(url).ContinueWith(
                task => {
                    this.contentTextBox.Text = task.Result;
                    this.logTextBlock.Text = "完了";
                },
                TaskScheduler.FromCurrentSynchronizationContext());
        }

        private void cancelButton_Click(object sender, RoutedEventArgs e)
        {
            this.client.CancelPendingRequests();
        }
    }
}

0 件のコメント:

コメントを投稿