日期:2014-05-18  浏览次数:21599 次

c#_在多线程下访问WebBrowser对象报异常,"指定的转换无效。"
在 WebBrowser控件的DocumentCompleted事件里面激活了一个异步函数,这个函数的作用是根据传入的url,在WebBrowser里面所有的窗体里面搜索指定url的页面,如果检索到折返回这个htmlDocument的对象,可以每次运行到这个异步函数的时候就报错,我用调试在这个函数里面调试的时候,WebBrowser下的所有对象都显示函数超时,无法正常进行调试请高手指点.下面是部分代码

C# code

        /// <summary>
        /// WebBrowser页面加载完成事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void myWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            switch (e.Url.AbsoluteUri)
            {
                case "127.0.0.1/test2_2.aspx":
                    addFunction(set1 );
                    break;
                default:
                    break;
            }

        }



        /// <summary>
        /// 获取指定的页面框架
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        HtmlDocument getDom(   string url)
        {

            try
            {
                if (url == "")
                {
                    ////这个位置特别容易报错
                    return myWebBrowser.Document;
                }
                 if (myWebBrowser.Document.Url.AbsoluteUri == url) ////这个位置特别容易报错
                {
                    return myWebBrowser.Document;
                }
                foreach (HtmlWindow item in myWebBrowser.Document.Window.Frames)
                {
                    if (item.Document.Url.AbsoluteUri == url)
                    {
                        return item.Document;
                    }
                }
                return null;

            }
            catch (Exception e)
            {
                return null;
            }
        }



DocumentCompleted 事件和 getdom函数不是在一个线程里面运行的,
DocumentCompleted 事件调用addFunction()函数,addFunction()函数会新起一个线程,在新线程上运行set1函数,set函数里面调用的第一个函数就是 getdom()函数.就在这个getdom()函数里面报错.

------解决方案--------------------
顶...