Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Webrowser-正在等待文档加载_C#_Http_Asynchronous - Fatal编程技术网

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