2017-02-25 2 views
0

このコードは、Webページから情報を取得する必要があります。私の問題は、それが正面から見えず、理由を知らないということです。値が決まる前にC#変数が使用されています

ドキュメントの完成を待たずに、そのドキュメントの外に関数を作成する必要はありません。

私は大きなファイルから修正したい実際のコード:

public static string GetNews() 
{ 
    WebBrowser page = new WebBrowser(); 
    string data = null; 
    page.Navigate(launcherScriptAddress); 
    page.DocumentCompleted += delegate { 
    data = page.Document.GetElementById("news").InnerText; 
     // can't return `data` from here 
    }; 
    return data; // returns null because it doesn't wait for document to be completed 
} 
+2

はあなたをしましたあなたの 'MessageBox.Show'を' delegate'関数の中に入れてみてください。 –

答えて

1

これは、あなたがそれをやろうように動作しません。あなたの関数は、page.DocumentCompleted-delegateが実行される前に戻ります。

唯一できることは、デリゲート内で実行されるGetNews関数にコールバックを渡すことです。

同期に関する古い問題< - > async。

さらに、文の読み込みが開始される前に、.Navigateと.DocumentCompleted + = のスワップを行い、「ページ」にコールバックが設定されていることを確認する必要があります。

、あなたがデリゲートを作成し、機能を変更する必要があることを行うには、[編集] :その後

public delegate void NewsCallback(string dataReceived); 

public static void GetNews(NewsCallback callback) 
{ 
    WebBrowser page = new WebBrowser(); 
    string data = null; 
    page.Navigate(launcherScriptAddress); 
    page.DocumentCompleted += delegate { 
     data = page.Document.GetElementById("news").InnerText; 
     callback(data); 
    }; 
} 

、あなたはこのようにそれを呼び出すようにしたいことがあります。

void CallMyNews(){ 
    GetNews((dataReceived) => { 
     DoSomeStuffWith(dataReceived); 
    }); 
} 
+0

ああ..どうすればいいですか? – jeaks

+0

それはここでやる作業の少しですが、私はそれに応じて答えを編集します – Psi

関連する問題