非同期処理2 - peace098beat/windows_applicaciton GitHub Wiki
https://www.kekyo.net/2016/12/06/6186
using System.IO;
using System.Net;
using System.Threading.Tasks;
// Step5: メソッド内でawaitキーワードを使ったら、メソッドの先頭でasyncを加えなければならない。
// Step6: メソッド内でawaitキーワードを使ったら、戻り値の型はTask<T>型で返さなければならない。
// T型は本来返すべき戻り値の型。
// Step7: 非同期処理対応メソッドは、「慣例」で「~Async」と命名する(慣例なので必須ではない)。
public static async Task<string> ReadFromUrlAsync(Uri url)
{
using (WebClient webClient = new WebClient())
{
// Step1: OpenReadから非同期対応のOpenReadTaskAsyncに変更する。
// Step2: OpenReadTaskAsyncがTask<Stream>を返すので、awaitする。
// awaitすると、Streamが得られる。
using (Stream stream = await webClient.OpenReadTaskAsync(url))
{
TextReader tr = new StreamReader(stream, Encoding.UTF8, true);
// Step3: ReadToEndから非同期対応のReadToEndAsyncに変更する。
// Step4: ReadToEndAsyncがTask<string>を返すので、awaitする。
// awaitすると、stringが得られる。
string body = await tr.ReadToEndAsync();
return body;
}
}
}
// Step10: メソッド内でawaitキーワードを使ったら、メソッドの先頭でasyncを加えなければならない。
// Step11: メソッド内でawaitキーワードを使ったら、戻り値の型はTask型で返さなければならない。
// ここでは元々返す値が無かった(void)なので、非ジェネリックなTask型を返す。
// Step12: 非同期処理対応メソッドは、「慣例」で「~Async」と命名する(慣例なので必須ではない)。
public static async Task DownloadAsync()
{
Uri url = new Uri("https://github.com/Microsoft/dotnet/blob/master/README.md");
// Step8: ReadFromUrlから非同期対応のReadFromUrlAsyncに変更する。
// Step9: ReadFromUrlAsyncがTask<string>を返すので、awaitする。
// awaitすると、stringが得られる。
string body = await ReadFromUrlAsync(url);
Console.WriteLine(body);
}
# 補足: Htt
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
}
// Step3: メソッド内でawaitキーワードを使ったら、メソッドの先頭でasyncを加えなければならない。
// Step4: メソッド内でawaitキーワードを使ったら、戻り値の型はTask型で返さなければならない。
// しかし、Loadedイベントのシグネチャは変更できない。従って「void」のままとする。
// Step5: 非同期処理対応メソッドは、「慣例」で「~Async」と命名する。
// しかし、値を返さないためawait忘れの可能性はない事と、あくまで慣例であるため
// ここでは「~Async」と命名しない。
private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Uri url = new Uri("https://github.com/Microsoft/dotnet/blob/master/README.md");
// Step1: ReadFromUrlから非同期対応のReadFromUrlAsyncに変更する。
// Step2: ReadFromUrlAsyncがTask<string>を返すので、awaitする。
// awaitすると、stringが得られる。
string body = await ReadFromUrlAsync(url);
textBox.Text = body;
}
}