非同期処理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

UIでの非同期

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;
    }
}
⚠️ **GitHub.com Fallback** ⚠️