‫お帰りなさい｡
‫このビデオでは､ タスクについて､ 特にDWPで作業する場合について見ていきます｡
‫したがって､ 新しいプロジェクトを作り､ ここではWP Fを使い､ 私の場合はWP FのタスクとEEと呼ぶことにしましょう｡
‫次にOCキーを押してプロジェクトを作成し､ UIにボタンを追加します｡
‫そこで､ ボタンを選択してUIにドラッグするだけです｡
‫そこで､ 私たちは
‫ちょっと大きくして､ フォントサイズを32にしてみようか､ そんな感じです｡
‫これで少しは読みやすくなったので､ 名前を付けようと思います｡
‫Nameはボタンと同じです｡
‫わかりました｡
‫それがUIなんですね｡
‫とりあえず､ 後でちょっとしたWebブラウザを追加する予定ですが､ 今はボタンで問題ないでしょう｡
‫そして､ メインウィンドウで､ そのボタンを使いたいのですが､ そのためにはクリックイベントが必要です｡
‫誰かがそのボタンをクリックするたびに､ ウェブから何かをダウンロードし､ ダウンロードが完了したら､
‫そのHTMLをボタンのテキストまたはボタンのコンテンツに割り当てたいので､ クリックイベントが必要なのです｡
‫そこで､ ボタンをダブルクリックすると､ ここに新しいマイボタンクリックイベントが作成されます｡
‫つまり､ このメソッドはボタンをクリックするたびに起動されることになります｡
‫それが本当かどうかを確認する一番簡単な方法は､ メッセージボックスを使って､ 「こんにちは」とか「うまくいきました」とか､ そういうことを言うだけでいいんです｡
‫では､ このコードが実際に動くかどうか､ 実行してみましょう｡
‫というのも､ 何かする前に､ Buttonが動作して､ Hiと表示されるかどうかを確認するためです｡
‫わかったよ､ それでいいんだ｡
‫さて､ ご覧の通り､ テキスト自体はボタンのテキストほど大きくはないのです｡
‫それは､ きれいごとではありません｡
‫しかし､ この映像はそういうものではない｡
‫そうだろ？
‫タスクのことで､ UIが固まらないようにしながら､ バックグラウンドで何かをダウンロードすることです｡
‫よし､ じゃあ､ 引っかかるように工夫してみようか｡
‫では､ さっそくダウンロードのようなことをやってみましょう｡
‫そして､ 何かをダウンロードするためには､ HTTPクライアントを使えばいいわけで､ Webクライアントと呼ぶことにします｡
‫さて､ HTTPクライアントは､ 我々はシステムのドットネット､ ドット､ httpを追加する必要があるクラスです｡
‫それが､ ここで必要なことなのです｡
‫このWebクライアントは､ 新しいHTTPクライアントで､ HTMLとなる文字列を持ちたいのですが､
‫Webクライアントがドットで非同期に文字列を取得し､ どの文字列を取得するかは､ うまくいけばhttpsを取得するはずです｡
‫コロンフォワードスラッシュフォワードスラッシュグーグルドットコム｡
‫そして､ その結果が欲しいのです｡
‫そこで､ ウェブサイトをダウンロードし､ その結果をHTML内に保存してください｡
‫これがあれば大丈夫なんですね｡
‫そうですね｡
‫そして､ 私が見るのは､ そのスレッドです｡
‫だから､ 自分がやっているスレッドを見たいんです｡
‫右の線は､ スレッド番号とスレッドドットになります｡
‫そして､ 糸を使うためには､ 必要なことです｡
‫システムスレッドを使用し､ デバッグを使用するためには､ システム診断を使用する必要があります｡
‫では､ この2つを実行して､ 現在のスレッドと管理されているスレッドIDを取得することができるようにしましょう｡
‫そこで知りたいのは､ 今走っているスレッドのIDはどれなのか､ ということです｡
‫だから､ ボタンをクリックすると､ このデバッグが出力され､ 何かをダウンロードすることになるのです｡
‫ここで､ ボタンの内容を変更し､ ボタンの内容をdoneのようなものにしたとします｡
‫では､ それを検証してみましょう｡
‫そこにいるのは､ 私たちです｡
‫ボタンをクリックすると､ 今度はダウンロードが完了して､ 完了したことがわかります｡
‫そしてそれは､ ここにあるこの1枚があるからこそ起こることなのです｡
‫だから､ Googleをダウンロードすること｡ comは､ 実はかなり高速に動作するので､ コンテンツイコールやらせも可能なわけです｡
‫しかし､ 通常､ この作業はかなり時間がかかるので､ それはできないはずですし､ ほとんどの場合､
‫できないはずです｡
‫ダウンロードには通常時間がかかりますが､ この場合､ 実際にダウンロードしているのはごくわずかで､
‫Google dot comのウェブサイトをダウンロードしているだけなので､
‫とても短いものです｡
‫ほんの数キロバイトのことなんです｡
‫だからその代わり､ 5メガバイトのファイルをダウンロードするのはやめよう｡
‫だから､ それがすべて終わるまではもう少し時間がかかるんです｡
‫では､ もう一度確認してみましょう｡
‫ボタンを押すと､ 今度はフリーズするのがわかりますね｡
‫そして､ 一度だけdoneに変わりました｡
‫だから､ 25メガバイトのファイルは小さすぎるのかもしれない｡
‫200メガバイトのファイルを作ってみよう｡
‫実際にホームページで確認させてもらうと､ あるにはあるのですが｡
‫よし､ もう一度やってみよう｡
‫さて､ ファイルはかなり大きくなり､ かなりの時間がかかると思われます｡
‫それでボタンを押しているのですが､ 今見ていただいたように､ フリーズしてしまって､ ダウンロードが終わるまで何もないんです｡
‫それも､ 3本目に入ったからです｡
‫そのため､ そのダウンロードが完了するまで画面全体がフリーズしてしまい､ 何かと危険なのです｡
‫それはやめたほうがいい｡
‫メインスレッドやUIスレッドでは､ UIの更新で本当に忙しいので､ メインスレッドやUIスレッドで重いことをするときは常に注意する必要があります｡
‫それで､ UIをすべて実行したところ､ 今度は私のファイルやプログラムがフリーズしてしまいました｡
‫かなりね｡
‫だから､ 200メガバイトのファイルでいいんです｡
‫もしかしたら､ その方が良い選択で､ それが実行されても違いが分かるかもしれません｡
‫そうですね｡
‫だから､ 私はちょうどあなたが単にランダムなファイルを実行したり､ ダウンロードすることができますここでリンクを使用しています｡
‫では､ もう一度押してみましょう｡
‫今はご覧のように凍っているので､ 出来上がるまで少し時間がかかります｡
‫そして､ そこにいるのはあなたです｡
‫完成しました｡
‫そこでファイルをダウンロードし､ 完成しました｡
‫なるほど｡
‫そして､ 私たちは1番スレッドで動いていることもおわかりいただけると思います｡
‫それが本スレなんだろ？
‫メインスレッドで動いていて､ 何かをダウンロードしようとしたり､ UIを更新しようとしたりしているので､
‫ここで少し時間がかかってしまうわけです｡
‫では､ そのためのタスクを作ろう､ ということになるかもしれません｡
‫では､ 実行するタスクを作成し､ ここでいくつかのコードを実行することにしましょう｡
‫だから､ そのコードをそのままコピーするんだ｡
‫そして､ 今度はそれをデバッグしてみましょう｡
‫そこで､ ここにちょっとしたデバッグポイントを追加してみましょう｡
‫それでは､ どのスレッドが実際に関与しているのかを確認するために､ デバッグを進めてみましょう｡
‫ボタンを押すと､ 私たちはこのスレッドの中にいるわけです｡
‫そして､ そこに私たちはいます｡
‫そのため､ いくつかのワーカースレッドを用意しています｡
‫メインスレッドがあり､ これはスレッド1ですが､ 先ほど何かを実行したときにそれを見ました｡
‫つまり､ メインスレッドと､ 同様にスレッドを持つタスクランがあり､ 私たちはスレッド5に入っています｡
‫スレッド5はワーカスレッドで､ ここにあるのはそのスレッドです｡
‫では､ 次のステップに進みましょう｡
‫まだ､ あの､ 実行中というか､ スレッド5の段階なんですが｡
‫じゃあ､ もう一回やろうか｡
‫まだスレッド5です｡
‫そして今､ 私たちはあることに挑戦しています｡
‫そこで､ 私のボタンを更新しようとしているのです｡
‫完了しました｡
‫そして､ また次のステップに進みましょう｡
‫そして､ ご覧の通り､ 私のアプリケーションはフリーズしてしまいます｡
‫それは表現､ 私のボタンを評価することです｡
‫だから､ また待っているんです｡
‫だから､ かなり嬉しい｡
‫そして､ ご覧の通り､ 私たちは「オペレーション・エクセプション」に参加しています｡
‫呼び出したスレッドは､ 別のスレッドがそのオブジェクトを所有しているため､ アクセスすることができません｡
‫どういう意味ですか？
‫まあ､ 私のボタンが別のスレッドに所有されているということなのですが｡
‫そして､ どのスレッドで｡
‫メインスレッドであるUIスレッドが所有しています｡
‫つまり､ メインスレッドは､ UIエレメントがフリーズしないようにすべて面倒を見る役割を担っているわけです｡
‫UIは常に応答することが重要で､ この場合は正しいスレッドにないにもかかわらず､
‫このコード行にアクセスしようとしているため､ もう応答していないのです｡
‫つまり､ スレッド5で､ スレッド1に属するものにアクセスしようとしているわけですが､ それは無効なものなのです｡
‫そのため､ 無効な操作の例外が発生し､ これを管理するための別の解決策を見つける必要があります｡
‫そして､ それは一般的に異なるスレッドの概念である｡
‫ですから､ 一般に､ 異なるスレッドや異なるオブジェクトで作業する場合は､ 注意が必要です｡
‫オブジェクトが他のスレッドに所有されている場合､ そのオブジェクトを変更したり修正したりすることはできません｡
‫だから､ それは意識しなければならないことなのです｡
‫では､ どうすればいいのか｡
‫まあ､ 一般的には､ まずアプリを停止して､ ボタンに入りましょう｡
‫そこで､ ここにボタンを作り､ チェックアウトボタンにしたいと思います｡
‫だから､ コントロールを押したり､ コントロールを押しながらボタンを押したりしているんだ｡
‫つまり､ ボタンはボタンベースから､ コンテンツコントロールはコントロールから､ フレームワーク要素はUI要素から､
‫それぞれ継承しているのです｡
‫ビジュアル・オブジェクト､ ディスパッチャ・オブジェクト､ ディスパッチャ・オブジェクト､ そして私たちがそうであるように､ それはディスパッチャ・オブジェクトです｡
‫そして､ ここではアクセスチェックとX軸の検証を行うだけです｡
‫これはディスパッチャーオブジェクトで､ ここではディスパッチャーを使用しています｡ ディスパッチャーはたくさんの変数やイベントなどを持っています｡
‫なぜそれを見せるのか？
‫それは､ マイボタン用のスレッドを管理するためにディスパッチャを使うからです｡
‫では､ ここでどうすればいいのか｡
‫さて､ 私は私のボタンがディスパッチャをドットする必要があるので､ システムのWindowsのドットスレッドディスパッチャオブジェクトに関連付けられているを取得します｡
‫それでは､ どのスレッドがボタンに属しているのか､ あるいはボタンがどのスレッドに属しているのかを調べてみましょう｡
‫そこで､ ディスパッチャを確認してみましょう｡ ここでは､ システムウィンドウのスレッドディスパッチャが関連付けられているスレッドで､
‫指定したアクションを非同期に実行するよう呼びかけています｡
‫だから､ それこそが､ 私が言っていた､ 私たちがすべきことなのです｡
‫それでは､ このコードを実行してみましょう｡
‫だから､ そこの一番下で閉じます｡
‫この時点でどのスレッドにいるのかを確認するために､
‫もう一度デバッグを使用します｡
‫では､ もう一度コードを実行してみましょう｡
‫では､ ボタンを押してみましょう｡
‫そして､ ご覧の通り､ 今ここにいるのです｡
‫そして今､ 再び負荷を評価する必要があるため､ 私たちはスレッド5にいます｡
‫さて､ ここからがデバッグの本番です｡
‫そして､ 次のスレッドや次の行に行くのです｡
‫次の行で､ UIが元に戻る｡
‫どこ？
‫この中に
‫そして､ 次のステップに進むことができます｡
‫ディスパッチャの中に入って､ ここで実際にお見せしたかったことを飛び越えます｡
‫では､ 確認してみましょう｡
‫Windowsに移動して､ デバッグコンソールを見てみましょう｡
‫これがスレッド番号1､ これがスレッド番号5ですね｡
‫ボタンの持ち主はご覧の通り､ スレッド番号1番なんですね｡
‫そして､ それをもう少し明確にするために､ ここの行に追加することができます｡
‫スレッド番号1かスレッド番号､ そうそうたるメンバーが私のボタンを所有しているわけですから､ これで少しはわかりやすくなりますね｡
‫もう一度実行してみましょう｡ そうすれば､ 正しく表示されるはずです｡
‫で､ これが出力ですが､ まだ面白いものはないですね｡
‫ボタンを押すと､ 5番のスレッドが実行され､ ダウンロードが開始されるのがわかります｡
‫そして､ それが終わると､ Here, thread number one owns my buttonと表示されるのです｡
‫では､ もう一度押してみましょう｡
‫そして今､ ご覧の通り､ ボタンはまだ機能していますし､ 更新もされています｡
‫だからいいんです｡
‫というのも､ ひとつの方法です｡
‫しかし､ もうひとつ､ 好ましい解決策を紹介します｡
‫そこで､ この､ 私のボタンクリックをコピーします｡
‫邪魔にならないように､ マイボタンクリックトゥということにしています｡
‫そして今､ 私はどのスレッドにいるかというと､ 外です｡
‫では､ どのスレッドで？
‫ボタンをクリックしたい｡
‫じゃあ､ 私は赤いやつにしようかな｡
‫待ちタスクの実行を使うので､ そのタスクは非同期タスクにする｡
‫そこで､ ここにasyncキーワードを追加する必要があります｡
‫さて､ Visual Studioはまだあまり満足していないので､ このメソッドを非同期化する必要があります｡
‫つまり､ この私のボタンのクリックは､ 非同期に実行される特定のタスクを待機する非同期ボタンメソッドになります｡
‫ディスパッチャを使う代わりに､ このタスクの外側でボタンを更新することができます｡
‫だから､ ここで外でやるんです｡
‫私のボタンの内容を言うと､ Done downloadingみたいなのが出てきます｡
‫それだけです｡
‫そこで､ ディスパッチャを使う代わりに､ 非同期にすることで､ ちょっとした回避策にしました｡
‫さて､ それをテストするために､ ここのメソッドをclickメソッドに変更して､ button click toにします｡
‫そうでなければ､ このメソッドは決して実行されない｡
‫では､ そうしましょう｡
‫あと､ どのスレッドなのかも付け加えておきましょうか｡
‫だから､ タスク待ちの前にスレッド番号ソレを｡
‫そして､ こちらはウェイトタスクの後､ あちらはウェイトタスクの時になります｡
‫それでは､ もう一度実行してみましょう｡
‫ボタンを押しましょう｡
‫そして､ こちらがタスク前の状態です｡
‫それが1番でした｡
‫そして､ 2本目の糸であるウェイトタスクのとき｡
‫そして､ ウェイトタスクの後､ 再び1位になり､ ダウンロードが終了します｡
‫それは､ また別のアプローチなんですね｡
‫それも全く問題なく､ さらに良い方法だと思います｡
‫では､ 私がどのスレッドにいるのか確認する方法は必要ないのですね｡
‫でも､ こういうことをするのは別のスレッドを作って､ でも､ それも重しにするんですね｡
‫だから､ 非同期にするんですね｡
‫さて､ 同じく少しお見せしたいのが､ ウェブブラウザです｡
‫そこで､ これから行うのは､ ボタンのサイズを小さくすることです｡
‫この左上に置いて､ ウェブブラウザを使います｡
‫そこにドラッグして､ 少し大きくするだけです｡
‫これで､ このウェブブラウザがあれば､ 私たちがいる側が表示されるはずです｡
‫つまり､ ボタンを押すたびに､ 私が手動で定義した特定のウェブサイトをダウンロードすることになるのです｡
‫つまり､ これはこれまで見てきたことに追加するためのちょっとした例なのです｡
‫ウェブブラウザをフル活用するのはやめよう
‫その方法を紹介するつもりはない｡
‫自分でやってみるのもいい｡
‫これから､ この特定のリンクからダウンロードした､ ハードコードされたそのHTMLをどのように使うかをお見せします｡
‫そして､ 単にそれをそう使うか､ ウェブブラウザで表示させるだけです｡
‫だからhttps google｡ comを使用しています｡
‫つまり､ 私がボタンを押すたびに､ グーグルはどうなるのでしょう｡ comがダウンロードされます｡
‫そのためには､ 具体的な方法が必要です｡ 手入力するのではなく､ ここにコピー＆ペーストします｡
‫従って､ HTMLの変更に関するこのメソッドは､ 依存関係のプロパティが変更されるたびに呼び出されます｡
‫つまり､ ここで言いたいのは､ HTML上では､ changeには依存オブジェクトと､ Eと呼ばれるイベント引数への依存プロパティのchangeが必要だということです｡
‫そしてここでは､ その依存オブジェクトを受け取り､ それをウェブブラウザとして使用するウェブブラウザを作成しているだけです｡
‫そして､ WebブラウザがNULLでない場合､ 特定の文字列に移動し､ それが新しい文字列としての値となります｡
‫ですから､ 依存関係の引数が何であれ､ プロパティ変更イベントの引数が何であれ､ そこから文字列を取得するのです｡
‫つまり､ ウェブブラウザに表示する必要があるのは､ ほとんどこれだけなのです｡
‫だから､ もっと簡単な方法でやればよかったのですが､ 問題は､ そう簡単にはいかないということです｡
‫だから､ もっと簡単な方法､ たくさんあるわけではないんです｡
‫ですから､ ここでは一般的にそのようなアプローチが必要でしょう｡
‫そこで､ ダウンロードが完了したボタンを更新するだけでなく､ ウェブブラウザを更新したいので､ ウェブブラウザに名前が必要です｡
‫そこで､ ウェブブラウザに名前を付けて､ 私のウェブブラウザと呼ぶことにします｡
‫さて､ ウェブブラウザですが､ ここに呼び出したり､ 実際にここで修正したりします｡
‫私がやりたいのは､ そのブラウザの値を設定することで､ 何かで設定したいのです｡
‫そして､ dependency プロパティと値であるオブジェクトが必要であることがおわかりいただけると思います｡
‫では､ どうすればいいのか？
‫どこから持ってくればいいんだ？
‫さて､ ここには複数の､ 複数の事柄があります｡
‫そのうちの1つは依存性プロパティが必要なので､ それを作成しましょう｡
‫ここでは一番上に置いてみましょう｡
‫そしてまた､ コピー＆ペーストで｡
‫どのように見えるか､ 何ができるかをお見せします｡
‫つまり､ HTMLプロパティと呼ばれる読み取り専用の依存プロパティです｡
‫そして､ それを登録するのです｡
‫HTMLで登録するのです｡
‫ご覧のように､ 名前､ 文字列名､ HTML､ そしてプロパティタイプ､ オーナータイプ､ プロパティのメタデータが必要です｡
‫そのため､ WPFの章で依存性プロパティを扱う際に触れてきたことです｡
‫ここでは､ HTMLで作成し､ タイプは文字列です｡
‫オーナーとは？
‫メインウィンドウです｡
‫ここで私たちのクラス､ これはどういうデータなのか､ あるいはどのデータを与えればいいのか｡
‫そして､ on HTML changed metadataを付与しています｡
‫ということは､ どういうことでしょうか？
‫さて､ HTMLのプロパティを設定するたびに､ HTMLチェンジが呼び出されます｡
‫そして､ このメソッドが呼び出されることになるのです｡
‫では､ どうすればいいかというと､ 次のように私のブラウザの値を設定すればいいのです｡
‫HTMLプロパティと言って､ HTMLで設定すればいいのです｡
‫HTMLを使うためには､ ここでちょっとした工夫をしたり､ 回避策を講じたりする必要があります｡
‫実は､ このように私のHTMLということで､ ここに変数を作る必要があるんです｡
‫私のhttp lは､ ただblahと言うだけの文字列で､ ここにくだらないテキストが入っているだけの文字列で､ 特別なことは何もありません｡
‫しかし､ ダウンロードが完了すると､ その結果をHTMLの文字列に取り込むことができます｡
‫この文字列はローカルで作成されているので､ ここでHTMLと言うわけにはいかないし､
‫ここでのタスクの範囲内なので､ 外で作成することもできないのです｡
‫だから､ この小さな回避策が必要なんです｡
‫これで､ 私のHTMLはHTMLだと言い切ることができるわけです｡
‫だから､ これ｡
‫ここで設定した私のウェブブラウザの範囲内の変数です｡
‫だから､ 今､ ここにセットして行けるんです｡
‫だから､ アウェーチームタスクの範囲内｡
‫さて､ もちろん､ この行を終わらせる必要があります｡
‫つまり､ Webブラウザの値を設定する方法ですね｡
‫わかりました｡
‫ちょっとした回避策ですが､ うまくいくのでテストしてみましょう｡
‫では､ コードを実行してみましょう｡
‫ボタンが押されましたね｡
‫そして､ そこに私たちはいます｡
‫だから､ スクリプトの間違いはたくさんあるのですが､ それは↑のようなことを言ってないからです｡
‫しかし､ ご覧のように今はGoogleにいるので､ 画像やGoogleマップなどにアクセスすることができます｡
‫さて､ これで小さなブラウザができあがり､ 単純にGoogleにアクセスできるようになりました｡
‫わかったよ､ クールだ｡
‫だから､ さっきも言ったように､ ブラウザとかにはあまり深入りしないし､ そういう話題にはあまり触れたくなかったんです｡
‫でも､ それはあくまでも設定上の話｡
‫それは､ ちょっと､ ええ､ ちょっとセットアップが必要なんです｡
‫このメソッドが必要で､ この依存性プロパティが必要で､ そして､
‫依存性プロパティであるHTMLプロパティと､ GoogleからダウンロードしたHTMLコードで､
‫ブラウザの値を設定して行くことができるのです｡
‫わかりました｡
‫早速ですが､ もう一度まとめますと､ 糸を使い分けるというのはどういうことでしょうか？
‫UIを処理するメインスレッドがあり､ 例えばウェブからダウンロードしたり､
‫あるファイルから別のファイルにコピーしたり､ ハードディスクを操作したりと､ 重くて少し時間がかかるようなことをする場合です｡
‫そこで､ バックグラウンドでそれをやることに本当に意味があるんです｡
‫そこで､ その処理を行う別のタスクやスレッドを作成するのです｡
‫そこで､ ここではバックグラウンドでそれを行う非同期タスクを作成し､ それが完了したら､ 残りの作業を進められるようにしました｡
‫そのため､ メインスレッドがフリーズすることもなく､ UIもきちんと動作しますし､ それが何よりの強みです｡
‫わかりました｡
‫でお会いしましょう｡