前提:
・Windowsフォームに3つWebBrowserがある
・このWebBrowserを非同期に操作したい(目的)
・非同期の処理はtaskを使って実行する
行ったこと:
・Windowsフォームを操作する処理を関数化する(どのWebBrowserを操作するのかは引数で指定する)
・上記の関数を複数のtaskを使用して呼び出す
→エラーが出る「指定されたキャストは有効ではありません。」
グーグルさん:
「Windowsフォームのコンテンツには別スレッドから直接アクセスできない。
呼び出し元と違うスレッドならデリゲートを作ってそこから経由してアクセスしてね」
以下質問です。
調べて以下のようにしてみたところ「メソッド名が必要です」とエラーが出てしまいます。
いくつかの調べたサイトでは、delegateを宣言する時は全てvoidだったのですが、voidではないとダメなのでしょうか?
だけどvoidだと値を読み取って渡すということができないような。と考えていたら混乱してしまいました。
ご教授頂けたら幸いです。
以下ソースコードです。
public partial class Form1 : Form
{
public delegate void GetElementsDelegate(HtmlElementCollection objHtmlElementCollection);
private async void button1_Click(object sender, EventArgs e) { for (intI = 0; intI <= 2; intI++) { //【引数によって使用するWebBrowserを制御する】 WebBrowser WebBrowserTemporary = null; if (intI == 0) { WebBrowserTemporary = this.WebBrowser0; } else if (intI == 1) { WebBrowserTemporary = this.webBrowser1; } else if (intI == 2) { WebBrowserTemporary = this.webBrowser2; } else { return; } //タスクを複数起動する Task.Factory.StartNew(() => { LoadSart(WebBrowserTemporary); }); } } private void LoadSart(WebBrowser WebBrowserTemporary) { WebBrowserTemporary.Navigate("URL"); HtmlElementCollection oHtmlElementCollection; //ここでエラーが出る(遷移先のURLを読み込みたい) oHtmlElementCollection = Invoke(new GetElementsDelegate(GetElements(WebBrowserTemporary))) ; } public HtmlElementCollection GetElements(WebBrowser aoWebbrowser) { return aoWebbrowser.Document.GetElementsByTagName("section"); ; }
}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。