私は WCF サービス アプリケーションを作成しましたが、基本的に名前以外は何も変更していません。デフォルトのコントラクトがありGetData(Int32)
、文字列を返すメソッドが含まれています。
次に、.NET FW 4.5をターゲットとするWPF クライアントアプリケーションを作成したので、そのサービスへのサービス参照を追加する場所で、生成されたサービス クライアントにコントラクト メソッドのタスク ベースの非同期バリアントを含めることを選択できます。
サービスを利用しようとすると、次のようになります。
using (var client = new RhaeoServiceClient())
{
client.GetDataAsync(17).ContinueWith(t => MessageBox.Show(t.Result));
MessageBox.Show("inb4");
}
ボタンクリックハンドラーから実行すると、ウィンドウが停止し、ボタンが1秒ほど押されたままになり、"inb4"
メッセージが表示されるため、タスクがメインスレッドで実行されてネットワークを待機し、UIがフリーズするようです。
クリックしてもすぐには"inb4"
表示されず、タスクが実行された後、私が言ったように1〜2秒待っているようです。ショーの後"inb4"
、結果が表示された次のメッセージボックスも表示されますが、面白いのは、次のメッセージボックスが最初のメッセージボックスを閉じるのを待たずに、最初のメッセージボックスが表示された直後に最初のメッセージボックスにポップすることです。
継続コードが実際には別のスレッドで実行され、メイン スレッドが最初のメッセージ ボックスによってブロックされていることを気にしないように見えるため、これは混乱を招きます。しかし、UI スレッドからしか表示できないメッセージ ボックスをどのように表示するのでしょうか (そうですか?)。
また、タスクの実行後に最初のメッセージ ボックスが待機し、表示され、閉じられずに次のメッセージ ボックスが表示されるのはなぜですか?