タスクの終了だけわかればよく、途中の進捗を通知する必要がない場合、通知用のクラス(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 件のコメント:
コメントを投稿