在确定值之前使用C#变量

时间:2017-02-25 00:41:39

标签: c# .net webclient

此代码应从网页中获取一条信息。我的问题是,它并没有显示出来,并且不知道为什么。

我想以某种方式让它等待文档完成而不在那个之外创建一个函数。

我想从更大的文件中修复的实际代码:

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
}

1 个答案:

答案 0 :(得分:1)

这不会像你尝试的那样工作。您的函数在正在执行page.DocumentCompleted-delegate之前返回。

所以你唯一能做的就是将回调传递给你的代表中执行的GetNews函数。

同步的旧问题< - >异步。

此外,您应该交换语句.Navigate和.DocumentCompleted + = 确保“page”在开始加载任何内容之前设置回调。

[编辑] 为此,您需要创建一个委托并更改您的功能:

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);
    } );
}