Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# NET控件-如何检查以前的事件是否已完成?_C#_Multithreading_Web Controls - Fatal编程技术网

C# NET控件-如何检查以前的事件是否已完成?

C# NET控件-如何检查以前的事件是否已完成?,c#,multithreading,web-controls,C#,Multithreading,Web Controls,一开始,我想道歉,因为这个问题的标题可能有误导性,但我找不到更好的方式来命名它 问题是: 我有一个应用程序,它从文件中读取帐户信息,然后基于此,它应该登录到网站-当通过WebBrowser的DocumentComplete事件执行每个步骤时,一切都很好,但我想重新编写代码,这样看起来会更好,更容易修改和升级 现在,为了登录,我必须从网站获取令牌,然后发送带有登录名、密码和令牌的postdata,所以我想创建两种方法: 阿格特肯 博客 现在它们看起来像:用户itsme86给出的解决方案已经尝试过了

一开始,我想道歉,因为这个问题的标题可能有误导性,但我找不到更好的方式来命名它

问题是:

我有一个应用程序,它从文件中读取帐户信息,然后基于此,它应该登录到网站-当通过WebBrowser的DocumentComplete事件执行每个步骤时,一切都很好,但我想重新编写代码,这样看起来会更好,更容易修改和升级

现在,为了登录,我必须从网站获取令牌,然后发送带有登录名、密码和令牌的postdata,所以我想创建两种方法:

阿格特肯 博客

现在它们看起来像:用户itsme86给出的解决方案已经尝试过了,但仍然不起作用

       public void GetToken()
                {
                    browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(AfterLoadingTokenSite);
                    browser.Navigate("https://somewebsite.com");
                }

    private void AfterLoadingTokenSite(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                //here code which parse HTML in order to find token - works perfectly

            }

            public void LogIn()
            {
                string postData = string.Format("_mToken={0}&userID={1}&userPW={2}", userToken, userID, userPW);
                UTF8Encoding standardEncoding = new UTF8Encoding();

                browser.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(AfterLoadingTokenSite);
                browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(AfterLoadingLoginSite);

                browser.Navigate("https://www.somewebsite.com/login/", "", standardEncoding.GetBytes(postData), "Content-Type: application/x-www-form-urlencoded\r\n");
            }

            private void AfterLoadingLoginSite(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
                    return; 
                else if (browser.DocumentText.Contains("Logged in as"))
                {
                    _logged = true;
                }
            }


And on FormLoad event I wanted to load all accounts from file to List and then do something like that:

    LoadAccountsFromFile();
    if (loadedAccounts)
    {
         foreach (Account n in AllAccounts)
         {
              n.GetToken();
              n.LogIn();
         }
    }
但这不起作用,因为据我所知,WebControl没有默认机制,可以在启动下一个事件之前等待上一个事件完成,所以我的代码直接登录,而无需等待AfterLoadingTokenSite完成

所以我的问题是如何预防它


它必须在.NET 3.5中完成。

您可以使用AutoResetEvent进行同步。Account.Login将通过AutoResetEvent.WaitOne阻止,直到Account.GetToken从DocumentCompleted事件处理程序调用AutoResetEvent.Set,就像您现在设置的那样。您可以在这里了解更多信息:这不起作用,WaitOne调用将使程序死锁,因为它阻止引发DocumentCompleted事件。永远不要阻止UI线程。是的,我试图在itsme86的评论之后实现它,但这不起作用。用更新的代码更新问题你们还有其他想法吗?把你们的问题改成包含一个不起作用的建议是不太好的。要么显示两个版本,要么只显示原始代码。然后,你可以根据你的原始代码得到建议,而不会混淆你知道的不起作用的东西。好的,谢谢。删除了更新后的代码,并保持其原始状态,注意我已经尝试了itsme86方法。