初心者的なことで申し訳ありません。
bybalsenderともうします。
先日async、awaitを使用したコードをもらいましたが、環境がvs2005のため動作しません、そこでasync、awaitを利用しない方法を教えてください。
取得したいのは翻訳結果です。
どのような方法でも構いません。
以下のコードでasync、awaitを削除したいです。
const string ur = "http://honyaku.yahoo.co.jp/transtext/";
List<string> _ant = new List<string>();
private void Form1_Shown(object sender, EventArgs e)
{
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.Navigate(ur);
_ant.Add("日本語に翻訳");
_ant.Add("英語に翻訳");
_ant.Add("中国語に翻訳");
_ant.Add("ドイツ語に翻訳");
}
async private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (ur == e.Url.ToString())
{
var tasks = new List<Task>();
foreach (string htm in ant)
{
webBrowser1.Document.GetElementById("textText").InnerText = htm;
webBrowser1.Document.GetElementById("btn").InvokeMember("Click");
await Task.Run(() =>
{
Thread.Sleep(1000);
}).ContinueWith( => btn_click(),
TaskScheduler.FromCurrentSynchronizationContext());
}
Task.WaitAll(tasks.ToArray());
}
}
private void btn_click()
{
MessageBox.Show(webBrowser1.Document.GetElementById("trn_textText").InnerText);
}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/25 04:08
回答2件
0
根本的な疑問なのですが、vs2005のような古いバージョンを使い続ける理由はなんでしょうか?
今はvs2015 community(基本無料 企業でも条件付きで使用可能)もありますし、
それを検討してみるのはいかがでしょうか?
投稿2016/09/26 01:32
総合スコア1294
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/07 23:06
0
ベストアンサー
何故先のスレッドの回答者の方が 1 秒待って[翻訳]ボタンをクリックするのを非同期で実装したのか真意が分かっていませんが、そんなことをする必要はなさそうな気がします。
前のスレッドの質問者さんのコードで 1 回目の「てすと1」がうまく行ったのは、1 回目だけは WebBrowser.DocumentCompleted イベントの発生(応答が返ってきてドキュメントの読み込みが完了)を待って InvokeMember("Click") メソッドで[翻訳]ボタンをクリックしたから、2 回目以降は 1 回目の応答が返ってこないのに foreach ループで[翻訳]ボタンを高速クリックしたからではないかと思います。
先のスレッドの回答者の方が 1 秒待つという案を出していますが、それは応答が返ってきてドキュメントの読み込みが完了するまで時間がかかるからそれを待つという話だと思います。
でも、それを非同期にやる必要はないと思います。また、1 秒で応答が返ってこない(混んでると 10 秒かかるかもしれない)ということもあるわけで、「1 秒」が適切かは疑問です。
たぶん、WebBrowser.DocumentCompleted ハンドラの中で InvokeMember("Click") メソッドで[翻訳]ボタンをクリックした場合、WebBrowser は再度同じ URL にナビゲートされると共に、id="textText" の原文を送信すると思われます。
その応答が返ってくると再度 WebBrowser.DocumentCompleted イベントが発生するはずです。
なので、WebBrowser.DocumentCompleted イベントハンドラの中で foreach で回すのはやめて、[翻訳]ボタンクリックで「てすと1」を送信 ⇒ その応答が返ってきて DocumentCompleted イベントが発生した時「テスト2」を送信 ⇒ 同様に「test三」「test四」を繰り返す・・・とすればよさそうです。
お試しください。
【サンプルコード追記】
最初のスレッドにあった以下の質問者さんの DocumentCompleted イベントハンドラコードを、
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (ur == e.Url.ToString()) { foreach (string htm in _ant) { webBrowser1.Document.GetElementById("textText").InnerText = htm; webBrowser1.Document.GetElementById("btn").InvokeMember("Click"); btn_click(); } test(); } }
を以下のようにしてみたらいかがでしょう? 頭の中で考えて書いただけで検証はしてないので、質問者さんの方でデバッガ等を使って期待通りの動きになるか十分検証してください。
int n = 0; private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (ur == e.Url.ToString()) { if (n < _ant.Count) { string htm = _ant[n]; webBrowser1.Document.GetElementById("textText").InnerText = htm; webBrowser1.Document.GetElementById("btn").InvokeMember("Click"); btn_click(); n++; } test(); } }
InvokeMember("Click") のあと、制御がまたこのハンドラに戻ってくるかがキモなのですが、うまく動かなかったらデバッガでそのあたりがどうなっているか調べて連絡ください。
【検証に使ったコードを追記】
検証に使ったコードを以下にアップしておきます。既存のコードを流用したので、手動で http://honyaku.yahoo.co.jp/transtext/ へのナビゲーションを開始するところがちょっと違いますが、基本は質問者さんがコードで示したやりたいことの通りのはずです。
実行結果は以下の画像の通りです。
http://surferonwww.info/BlogEngine/image.axd?picture=2016%2f9%2ftranstext.jpg
一応このサンプルでは期待通りの結果になりましたが、原文に入力している時に原文が何語かの判定を行うためサーバーとのやり取りをしているようで、プログラムで原文をセットして即送信では、場合によってはそのあたりがうまくいかないかもしれません。
対症療法的なことのカタマリのようなもので、Yahoo! は予告無しに html 要素の id、呼び出し先 url、その他いろいろ変えるでしょうから、明日は動かないかもしれません。
というわけで、最初のスレッドで htsign さんが書かれたように、自分もお勧めはできません。脅かすわけではないですが、クローラを作って図書館のサイトにアクセスしたら業務妨害で逮捕されたという例もあるようですし。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WebBrowser { public partial class Form1 : Form { // 2016/9/26 teratail の検証用 // https://teratail.com/questions/49159 private string url = "http://honyaku.yahoo.co.jp/transtext/"; List<string> _ant = new List<string>() { "日本語に翻訳", "英語に翻訳", "中国語に翻訳", "ドイツ語に翻訳" }; List<string> translated = new List<string>(); int count = 0; public Form1() { InitializeComponent(); textBox1.Text = url; webBrowser1.ScriptErrorsSuppressed = true; } private void navigateButton_Click(object sender, EventArgs e) { webBrowser1.Navigate(textBox1.Text); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // 初期画面 if (e.Url.ToString() == url) { if (count < _ant.Count) { // 最初の原文をセットして送信 webBrowser1.Document.GetElementById("textText").InnerText = _ant[count]; webBrowser1.Document.GetElementById("btn").InvokeMember("Click"); } } // 翻訳が返ってきたときの処理 if (e.Url.ToString().Contains("http://honyaku.yahoo.co.jp/darla/php/fc.php")) { count++; translated.Add(webBrowser1.Document.GetElementById("trn_textText").InnerText); // 次の原文をセットして送信 if (count < _ant.Count) { webBrowser1.Document.GetElementById("textText").InnerText = _ant[count]; webBrowser1.Document.GetElementById("btn").InvokeMember("Click"); } if (count == _ant.Count) { string result = ""; foreach (string s in translated) { result += s + "\n"; } MessageBox.Show(result); } } } } }
投稿2016/09/25 06:08
編集2016/09/26 03:45退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/25 06:24
退会済みユーザー
2016/09/25 07:02
2016/09/25 07:51
退会済みユーザー
2016/09/25 12:33
2016/09/25 13:33
退会済みユーザー
2016/09/26 03:38
2016/09/27 12:51
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。