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

C# C变量在确定其值之前使用,c#,.net,webclient,C#,.net,Webclient,此代码应该从网页中获取一条信息。我的问题是它没有正确地显示,也不知道为什么 我想让它以某种方式等待文档完成,而不创建该函数之外的函数 我想从更大的文件中修复的实际代码: public static string GetNews() { WebBrowser page = new WebBrowser(); string data = null; page.Navigate(launcherScriptAddress); page.DocumentCompleted

此代码应该从网页中获取一条信息。我的问题是它没有正确地显示,也不知道为什么

我想让它以某种方式等待文档完成,而不创建该函数之外的函数

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

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
}

你这样做是行不通的。在执行page.DocumentCompleted-delegate之前,函数返回路径

因此,您唯一能做的就是将回调传递给GetNews函数,该函数在委托中执行

sync-async的老问题

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

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

收到公共委托void NewsCallback字符串数据; 公共静态void GetNews新闻回调 { WebBrowser页面=新的WebBrowser; 字符串数据=null; page.navigateLauncherscript地址; page.DocumentCompleted+=委托{ 数据=page.Document.GetElementByIdnews.InnerText; 回调数据; }; } 之后,您可以这样称呼它:

无效呼叫我的新闻{ GetNews dataReceived=>{ DoSomeStuff接收到的数据; } ; }
您是否尝试将MessageBox.Show放入委托函数中?噢。。我该怎么做呢?这里有一点工作要做,我会相应地编辑答案