C# Webrowser-正在等待文档加载
我想创建一个方法,该方法将等待文档未加载 我有这样的想法:C# Webrowser-正在等待文档加载,c#,http,asynchronous,C#,Http,Asynchronous,我想创建一个方法,该方法将等待文档未加载 我有这样的想法: WebBrowser webBrowser = new WebBrowser(); MyClient client = new MyClient(webBrowser); client.LogIn("test", "omg"); //block thread client.NotImplemented(); //i'm already logged; class MyClient { bool Started;
WebBrowser webBrowser = new WebBrowser();
MyClient client = new MyClient(webBrowser);
client.LogIn("test", "omg"); //block thread
client.NotImplemented(); //i'm already logged;
class MyClient
{
bool Started;
WebBrowser webBrowser;
public MyClient(WebBrowser wb)
{
webBrowser = wb;
webBrowser.DocumentCompleted += (sender, e) =>
{
if (e.Url == webBrowser.Url)
{
Started = false; //page loaded
}
};
}
public void LogIn(string login, string password)
{
this.Navigate("mymagicsite.com");
}
private void Navigate(string url)
{
webBrowser.Navigate(url);
Started = true;
while(Started)
Task.Delay(50);
}
}
当我调用登录方法时,我想“阻止”我的线程。
问题出现在
任务中。延迟,它阻止了导航,什么也没有发生。您必须保持UI线程正常运行,并在加载完成后禁用表单和启用
用法
实施
您可以使用TaskCompletionSource
发送与异步
兼容的某个事件“通知”
像这样:
class MyClient
{
TaskCompletionSource<object> navigation;
WebBrowser webBrowser;
public MyClient(WebBrowser wb)
{
navigation = new TaskCompletionSource<object>();
webBrowser = wb;
webBrowser.DocumentCompleted += (sender, e) =>
{
if (e.Url == webBrowser.Url)
{
navigation.TrySetCompleted(null);
}
};
}
public Task LogIn(string login, string password)
{
navigation = new TaskCompletionSource<object>();
webBrowser.Navigate(url);
return navigation.Task;
}
}
我不明白--您对上面的代码示例到底有什么要求?您遇到了什么问题?问题是webBrowser.Navigate()不阻止线程(我想要webClient.DownloadString(“www.google.pl”)-它阻止了当前线程)。它不工作。我不知道为什么,但DocumentCompleted事件甚至没有发生…如果你使用fiddler,你看到导航发生了吗?如果删除If(e.Url==…)行,那么它能工作吗?我正在尝试这个简单的代码:webBrowser.Navigate(“);而(webBrowser.ReadyState!=WebBrowserReadyState.Complete){Task.Delay(50);}但是ReadyState一直未初始化。看起来Navigate正在UI线程上工作,当我阻止此线程时,导航没有运行。由于您需要运行UI线程,我已经更新了awswer
class MyClient
{
Form frm;
public MyClient(WebBrowser wb, MethodInvoker callback)
{
frm = (Form) wb.Parent; // assume WebBrowser is directly on the form
webBrowser = wb;
webBrowser.DocumentCompleted += (sender, e) =>
{
frm.Invoke( new MethodInvoker( () => frm.Enabled = true ));
frm.Invoke(callback);
};
}
private void Navigate(string url)
{
webBrowser.Navigate(url);
frm.Enabled = false;
}
}
class MyClient
{
TaskCompletionSource<object> navigation;
WebBrowser webBrowser;
public MyClient(WebBrowser wb)
{
navigation = new TaskCompletionSource<object>();
webBrowser = wb;
webBrowser.DocumentCompleted += (sender, e) =>
{
if (e.Url == webBrowser.Url)
{
navigation.TrySetCompleted(null);
}
};
}
public Task LogIn(string login, string password)
{
navigation = new TaskCompletionSource<object>();
webBrowser.Navigate(url);
return navigation.Task;
}
}
WebBrowser webBrowser = new WebBrowser();
MyClient client = new MyClient(webBrowser);
await client.LogIn("test", "omg");