在确定其值之前使用 C# 变量
C# variable is used before it's value is determined
这段代码应该从网页中获取一段信息。我的问题是它没有正确显示并且不知道为什么。
我想以某种方式让它等待文档完成而不在该文档之外创建函数。
我想从更大的文件中修复的实际代码:
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
}
这不会像您尝试的那样工作。你的函数 returns 在 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);
} );
}
这段代码应该从网页中获取一段信息。我的问题是它没有正确显示并且不知道为什么。
我想以某种方式让它等待文档完成而不在该文档之外创建函数。
我想从更大的文件中修复的实际代码:
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
}
这不会像您尝试的那样工作。你的函数 returns 在 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);
} );
}