Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# 从线程访问和更改winform webbrowser_C#_Windows_Winforms_Multithreading - Fatal编程技术网

C# 从线程访问和更改winform webbrowser

C# 从线程访问和更改winform webbrowser,c#,windows,winforms,multithreading,C#,Windows,Winforms,Multithreading,我正在使用Windows应用程序,其中有一个tabControl,用户可以在其中像IE一样打开多个选项卡。现在我必须访问选定的选项卡,然后对打开的文档执行一些操作 我可以访问它,但在访问所选选项卡并执行操作后 当我使用另一个线程执行此任务时,应用程序将挂起 请建议我该怎么做 我正在使用.NET4.0。C# 请参阅下面的代码,此代码位于单击按钮上 TextToSpeechThread = new Thread(new ThreadStart(ReadWebDocument));

我正在使用Windows应用程序,其中有一个tabControl,用户可以在其中像IE一样打开多个选项卡。现在我必须访问选定的选项卡,然后对打开的文档执行一些操作

我可以访问它,但在访问所选选项卡并执行操作后

当我使用另一个线程执行此任务时,应用程序将挂起

请建议我该怎么做

我正在使用.NET4.0。C#

请参阅下面的代码,此代码位于单击按钮上

   TextToSpeechThread = new Thread(new ThreadStart(ReadWebDocument));
        TextToSpeechThread.Name = ApplicationManager.GlobalThreadNaming.TextToSpeech.ToString();
        TextToSpeechThread.SetApartmentState(ApartmentState.STA);
        TextToSpeechThread.Start();
这是调用该操作的线程方法

 browserTabControl.Invoke(new MethodInvoker(delegate
        {

            browserTabControl.SelectedTab.Controls[0].Invoke(new MethodInvoker(delegate
            {
                WebBrowser _browser = (WebBrowser)(browserTabControl.SelectedTab.Controls[0]);

                my_Voice.Speak(_browser.DocumentTitle.ToString(), my_Spflag);

                foreach (var link in _browser.Document.All)
                {
                    HtmlElement elem = (HtmlElement)(link);
                    Thread tempThread = new Thread(new ParameterizedThreadStart(HighlightingWebDocument));
                    tempThread.Start(elem);

                    if (elem.TagName == "A")
                    {
                        if (elem.InnerText != null)
                        {
                            if (elem.InnerText.ToString() != "")
                            {
                                my_Voice.Speak(elem.InnerText.ToString(), my_Spflag);
                            }
                        }
                    }
                    if (elem.TagName == "DIV")
                    {
                        if (elem.InnerText != null)
                        {
                            if (elem.InnerText.ToString() != "")
                            {
                                my_Voice.Speak(elem.InnerText.ToString(), my_Spflag);
                            }
                        }
                        //my_Voice.Speak(elem.TagName.ToString(), my_Spflag);
                    }
                    if (elem.TagName == "IFRAME")
                    {
                        if (elem.InnerText != null)
                        {
                            if (elem.InnerText.ToString() != "")
                            {
                                my_Voice.Speak(elem.InnerText.ToString(), my_Spflag);
                            }
                        }
                    }
                    if (elem.TagName == "SPAN")
                    {
                        if (elem.InnerText != null)
                        {
                            if (elem.InnerText.ToString() != "")
                            {
                                my_Voice.Speak(elem.InnerText.ToString(), my_Spflag);
                            }
                        }
                    }
                    if (elem.TagName == "LINK")
                    {
                        if (elem.InnerText != null)
                        {
                            if (elem.InnerText.ToString() != "")
                            {
                                my_Voice.Speak(elem.InnerText.ToString(), my_Spflag);
                            }
                        }
                    }
                    if (elem.TagName == "INPUT")
                    {
                        if (elem.InnerText != null)
                        {
                            if (elem.InnerText.ToString() != "")
                            {
                                my_Voice.Speak(elem.InnerText.ToString(), my_Spflag);
                            }
                        }

                    }
                    Thread.Sleep(150);
                }
            }));


        }));
现在请提供一些有用的链接

这是你们建议的另一种方法

声明委托

delegate void HighlightBrowsercontent(HtmlElement elem);
    HighlightBrowsercontent highLightBrowsercontent = null;
模板荷载

  public Form1()
    {
        InitializeComponent();

        // initialise the delegate to point to an implemntation

        highLightBrowsercontent = new HighlightBrowsercontent(OnHighLightContent);

    }
在按钮上单击我想读出内容并突出显示链接的按钮

  private void button1_Click(object sender, EventArgs e)
    {
        HtmlElementCollection links = webBrowser1.Document.Links;

        this.backgroundWorker2.RunWorkerAsync(links);
    }
最后,这就是我想要执行的过程

 private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
        IAsyncResult res = BeginInvoke(myEnableCancel, new object[] { true });
        ReadDocumetnAsync((HtmlElementCollection)(e.Argument));
        BeginInvoke(myEnableCancel, new object[] { false });
    }

    void ReadDocumetnAsync(HtmlElementCollection elemCollection)
    {
        foreach (var elem in elemCollection)
        {
            HtmlElement elem1 = (HtmlElement)(elem);

            SpeechLib.SpVoice myVoice = new SpeechLib.SpVoice(); ;
            if (elem1.InnerText != null)
            {
                BeginInvoke(highLightBrowsercontent, elem);
                myVoice.Speak(elem1.InnerText);
                System.Threading.Thread.Sleep(450);

                IAsyncResult ar = BeginInvoke(highLightBrowsercontent, elem);// Update the screen
                // Wait until the folder has been created before proceeding with the content of the folde
                while (!ar.IsCompleted)
                {
                    Application.DoEvents();
                    ar.AsyncWaitHandle.WaitOne(-1, false);
                }


            }

        }

    }
 public void OnHighLightContent(HtmlElement element)
    {
        HtmlDocument doc2 = webBrowser1.Document as HtmlDocument;
        toolStripStatusLabel2.Text = element.OuterHtml;
        element.Focus();
        element.ScrollIntoView(false);
        StringBuilder html = new StringBuilder(doc2.Body.OuterHtml);
        String substitution = "<span style='background-color: rgb(255, 255, 0);'>" + element.OuterHtml + "</span>";
        html.Replace(element.OuterHtml, substitution);
        doc2.Body.InnerHtml = html.ToString();
    }
private void backgroundWorker2\u DoWork(对象发送方,DoWorkEventArgs e)
{
IAsyncResult res=BeginInvoke(myEnableCancel,新对象[]{true});
readdocumetnancy((HtmlElementCollection)(e.Argument));
BeginInvoke(myEnableCancel,新对象[]{false});
}
void readdocumetnancy(HtmlElementCollection elemCollection)
{
foreach(元素集合中的变量元素)
{
HtmlElement elem1=(HtmlElement)(elem);
SpeechLib.SpVoice myVoice=新建SpeechLib.SpVoice();
if(elem1.InnerText!=null)
{
BeginInvoke(highLightBrowsercontent,elem);
myVoice.Speak(elem1.InnerText);
系统.线程.线程.睡眠(450);
IAsyncResult ar=BeginInvoke(highLightBrowsercontent,elem);//更新屏幕
//在继续处理文件夹内容之前,请等待文件夹创建完成
而(!ar.IsCompleted)
{
Application.DoEvents();
ar.AsyncWaitHandle.WaitOne(-1,false);
}
}
}
}
HighlightContent(HtmleElement元素)上的公共void
{
HtmlDocument doc2=webBrowser1。文档为HtmlDocument;
toolStripStatusLabel2.Text=element.OuterHtml;
元素Focus();
元素。ScrollIntoView(false);
StringBuilderHTML=新的StringBuilder(doc2.Body.OuterHtml);
字符串替换=“element.OuterHtml+”;
Replace(element.OuterHtml,substitution);
doc2.Body.InnerHtml=html.ToString();
}
它是只读的第一个链接。
我不知道这是怎么回事。

不允许从与您试图更改的控件关联的调度程序线程以外的线程更改用户界面。您需要使用来完成来自不同线程的更新。

由于调用,此代码在主线程上运行,而不是在工作线程上运行。是的,它会在UI开始运行时阻塞它,Speak()需要时间。使用BeginInvoke并不能解决这个问题

首先在
列表中收集字符串,时间不应超过秒的几分之一。把那张单子传给工人说


使用SpeakAsync()也可以起作用,避免线程,使中止讲话变得更容易,但跟踪页面上的位置会更加困难。顺便说一句,通过迭代器清楚地解决了问题,请查看您最喜欢的C语言书中的yield关键字。

您尝试过的任何代码示例、异常文本或屏幕截图,以便更好地描述问题?我没有遇到错误,只是在尝试运行时挂起了它。实际上,我必须读出所有的文档内容,为此,我使用了一个单独的线程,找到所有的链接、div、span,并为用户读出。它正在工作,但应用程序变成了hangI正在使用建议的东西。我张贴代码,请审查。感谢回复,.@Abhisheks.net:您是否尝试过使用BeginInvoke而不是Invoke?我使用了它,但运气不佳,问题是相同的。我使用了后台工作程序,但它产生了另一个问题。我已经发布了新代码,请检查有什么错误,。。谢谢你的建议。你根本没有听从我的建议。代码看起来很糟糕,可能会在异常情况下死掉。我想我帮不了你,祝你好运。