c#如何通过子线程控制主线程控件呢?

我主窗口有个webbrowser控件,想通过子线程点击已显示出来的网页实现填写的功能,要怎么实现呢?我直接写代码会出错;
求大神贴点代码!

我用主线程弄个按钮是可以点击的,就是子线程不行

错误信息:
“System.InvalidCastException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生

其他信息: 指定的转换无效。

线程代码
HtmlElement ht = webBrowser1.Document.GetElementById("J_imlis");
HtmlElementCollection ht2 = ht.GetElementsByTagName("a");
foreach (HtmlElement item in ht2)
{
ab++;
if (ab == 1)
{
item.InvokeMember("click"); //执行点击

break;
}
}

1

2个回答

我用主线程弄个按钮是可以点击的,就是子线程不行

错误信息:
“System.InvalidCastException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生

其他信息: 指定的转换无效。

线程代码
HtmlElement ht = webBrowser1.Document.GetElementById("J_imlis");
HtmlElementCollection ht2 = ht.GetElementsByTagName("a");
foreach (HtmlElement item in ht2)
{
ab++;
if (ab == 1)
{
item.InvokeMember("click"); //执行点击

break;
}
}

0

我记得好像是为了线程安全,所以控件只能被创建的线程所调用。所以子线程是不能操作webBrowser1及其所属控件的。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
主线程 如何控制 子线程
当我开始在 Win32 上使用线程时,这个问题就一直在折磨我。我花了数天甚至数周的时间来寻找答案,并且希望找到的是一个好答案。 这个问题是: 我如何在某个线程内终止另一个正在运行的线程? TerminateThread() 强迫其行动目标(一个线程)结束,手段激烈而有力,甚至不允许该线程有任何“挣扎”的机会。这带来的副作用便是,线程没有机会在结束前清理自己
c#子线程调用主线程控件
相信对多线程有所了解的人都知道,子线程是不能直接操作winform上的控件的,因为默认的控件是在主线程上生成的,子线程是不能直接访问或者修改的,直接访问或者修改控件属性的话会报错。这个即使在Java上也是这样,Android中也经常被用到的。 这样的话,子线程岂不是没办法访问主线程生成的控件了,当然是否定的,有问题就用解决办法,微软的人更了解这一点,并且有好几种解决办法,主要的思路就是在子线程里
主线程如何控制子线程的问题
现在在做一个把网页生成图片的批处理,每次处理200左右个网页rnrn主线程里面启动子线程,每个子线程生成一个图片,rn但是希望在主线程里面能够控制子线程,如果网页读取超时的话,rn就结束子线程,但是总是不能正常结束。rn有时候子线程抛出异常,主线程也结束了。rnrn帮我看看下面的代码有没有问题,如果有,需要怎样修改rnrn for (int i = 0; i < list.Rows.Count; i++)rn rn tryrn rnrn DataRow row = list.Rows[i];rn ..................rnrn ImageThread imageThread = new ImageThread(URL);rn ThreadStart threadStart = new ThreadStart(imageThread.makeImage);rn Thread thread = new Thread(threadStart);rn thread.Start();rn Thread.Sleep(60000);rnrn if (thread.ThreadState == ThreadState.Stopped && imageThread.STATUS == 0)rn rn //成功处理rn rn elsern rn int times = 3;rn while (thread.ThreadState == ThreadState.Running && times != 0)rn rn Thread.Sleep(20000);rn times--;rn rn thread.Abort();rn rnrn rn catch (Exception ex)rn rn //错误处理rn rn
c#主线程与子线程如何通信
当登陆窗体的登陆按钮被按下时,我启动一个子线程去显示进度条,第一个要求是如果在进度条显示过程中,已查出数据(无论用户名和密码正确与否)马上关闭进度条窗体,并立即显示主窗体或错误提示;第二个要求是:假设在进度条走完以后,也没有查出数据,这样就会出现假死状态,为了解决这个问题,我想让进度条停留在90%的位置等候查询结果,当结果出来以后再走,然后在显示窗体或提示错误,有哪位高手指点一下,或者介绍c#方面讲解多线程的书或视频教程都可以,谢谢
子线程访问 主线程控件
ThreadPool.QueueUserWorkItem((item) => { var box = this.groupBox1; //调用方在对控件进行方法调用时是否必须调用Invoke 方法 if (box.InvokeRequired) {
c#主线程能控制子线程吗?
比如说我主线程里面的button点击事件能操作子线程里面正在进行的处理吗?
c#主线程和子线程
我想问问主线程与子线程的关系.rn比如一个程序,a为主线程,从a中生成子线程b1,b2,从b1中生成子线程c1,c2.rn1,此时,如果父线程b1运行完毕,子线程c1仍在运行,此时c1会否因为b1的消灭而被迫消灭,还是c1会继续运行?rn2,如果主线程a消灭,是否b1,b2,c1,c2也会强迫被消灭?rn3,主线程a是否是进程中第一个创建的线程同时也是最后一个消灭的线程?
C#子线程访问主线程的控件问题
在背景线程监听消息如果有消息就让该控件闪动,但是即便写成这个调用,虽然能运行但是程序很卡,怎么处理呢?[img=https://img-bbs.csdn.net/upload/201809/10/1536579432_543526.png][/img]
C# 子线程中访问主线程中的控件
C#,从子线程中访问空间的一种方式。
子线程和主线程通过handler 双向通信
主线程和子线程和HandlerThread 子线程间的通信
[★]WinForm中,主线程如何优雅的控制子线程?
在Winform界面中,为了客户的体验或者其他原因,我们总是将耗时的事务在另外新开的线程中进行操作,那么对于这些线程的控制,涉及到下面的这些情况,各位都是用什么方法解决呢?rn1. 启动线程;rn2. 线程间通讯;rn3. 线程终止;rn4. 线程中的异常处理;rnrn欢迎大家一起讨论下,我发现在这块现在感觉很难驾驭。rn当然,如果还有其他没有提到的,还请兄弟们直接给出。多谢!rn————————————————————————————————rnBTW:这个坛子里面的搜索现在很难用,我没有办法找到我想要的信息,不知道各位是否有同样的问题?
子线程如何interrupt主线程
子线程开始运行时,主线程开始sleep30秒。然后有两种情况:rn1,子线程运行时间超过30秒,主线程在30秒过后中断子线程;rn2,子线程30秒之内运行完成,则唤醒正在sleep中的主线程,继而主线程继续往下运行。rnrn我用sleep实现了情况1,但是对情况2却没办法。rnrn目前的思路是,在子线程运行后加一个.interupt()以中断在sleep中的主线程使其继续运行。但是,问题是,我找遍了也没找到主线程怎么表示,我是指主线程的代号是什么,所以没办法用。rnrn代码如下:rnrn//子线程rnpublic class Clock extends Threadrnrnvolatile boolean keepRunning = true;rnrnpublic Clock()rnrnrnrnpublic void run() rn while(keepRunning) rn try rn XXXXXXXX; //要执行的代码,运行时间可能不到30秒也可能超过30秒rn ?.interrupt();//问题即在此处,“?”代表主线程,“?”该是什么rn catch (Exception e1) rn // TODO Auto-generated catch blockrn e1.printStackTrace();rn rn rn rnrnpublic void pleaseStop() keepRunning = false; rnrnrnrn//主线程rnpublic class xwordrnrnpublic static void main(String[] args)rn XXXXX//rn rn Clock c= new Clock();rn c.start();rn try SECONDS.sleep(30); // 等待30秒rn catch(InterruptedException ignore) rn c.pleaseStop(); //30秒后,强制停止子线程crn rn XXXXXX//rnrnrnrnrnrn或者还有其他什么办法?多谢!
子线程如何访问主线程?
主线程根据一个数组创建子线程A1-ANrnrn我想用一个子线程B,控制主线程的数组,进行添加删除
子线程如何与主线程通信?
如下代码:rnHelloThread HelloT1=new HelloThread(argu1,1,2);rnHelloThread HelloT2=new HelloThread(argu1,3,4);rnHelloT1.start();rnHelloT2.start();rnrnHelloT1和HelloT2各执行一段代码,我要等它们都执行完毕,才可以进行下面的操作,rn我怎么才可以知道他们已经执行完毕了?
子线程如何主线程发消息?
在窗口类中用CreateThread创建了一个子线程,子线程将工作结果发消息给主线程。如何得到主线程的hWnd? LVOID param 已经传了this主线程指针。难道不传主线程的指针,而是传窗口类的句柄?
子线程如何关闭主线程?
在DLG类之外,创建一个对话框类CDLG,在CDLG窗口销毁的时候如何同时停掉主线程?
Handler主线程于子线程,子线程与子线程,主线程到子线程消息传递
Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
Handler消息传递详解-主线程到子线程、子线程到主线程、子线程到子线程 (二)
    前一篇篇幅限制,分割成了两篇。本篇将用示例演示主线程到子线程、子线程到主线程、子线程到子线程三种进程通讯方式。如果对ThreadLocal ,Looper,Handler不了解的,可以去看我的上篇文章:Handler消息传递详解-主线程到子线程、子线程到主线程、子线程到子线程 (一)代码是最好的表述,就直接先上代码吧。MainActivity代码public class MainActiv...
主线程-子线程
子线程不能更新主线程中的各个组件的状态。 即:只要是子线程就无法更新组件,那么现在只能采用与之前一样的方式,在子线程之中返回要操作的消息,而后在主线程之中利用Handler处理这些消息,从而实现线程的操作...
主线程和子线程
子线程通过 HandlerThread的thread.getLooper()绑定, 在主线程的handler的handlerMessage中调用threadHandler.sendMessageDelay(msg,1000);向子线程发送消息。 在子线程中通过handler.sendMessageDelay(msg,1000);向主线程发送消息 在一个启动点btn调用主线程的handler.send
主线程与子线程
我要的效果是: 点击一个按钮然后以9600的波特率发送三个指令,发送完后把波特率设置为38400进行后面的通信。rnrn这个串口通信我用的是一个类(CSerialPort),这个类在创建了对象进行发送数据时它是自己起了一个线程。rnrn我得大致用法如下:rnobject.setbaud( 9600 );rnobject.send( "command1" );rnobject.send( "command2" );rnobject.send( "command3" );rnobject.setbaud( 38400 );rnrn但是在实际应用时如果直接这样用的实际执行结果是如下的:rnobject.setbaud( 9600 );rnobject.setbaud( 38400 );rnobject.send( "command1" );rnobject.send( "command2" );rnobject.send( "command3" );rn如果在每一个操作时加一个sleep(10)基本上就能解决问题。但是对于不同的机器执行效果也不一样。rn在我的机子上执行正常,但是在别人的机子上大部分的执行结果如下:rnobject.setbaud( 9600 );rnSleep( 10 );rnobject.send( "command1" );rnSleep( 10 );rnobject.send( "command2" );rnSleep( 10 );rnobject.setbaud( 38400 );rnSleep( 10 );rnobject.send( "command3" );rnSleep( 10 );rn最后程序肯定是在各种各样的机子上使用的,我想有没有能够肯定按照上面的顺序执行的方法。rnrn谢谢!!rnrnrnrn
c#子线程与主线程之间的通信
c#子线程与主线程之间该怎么通信先说明一下,本人最近遇到了什么问题,就是在写写消息队列的时候,发现消息队列每次接收一个消息的时候都是创建了一个新的线程。这样就导致了消息处理的时候没有在主线程上进行,然而其中的一些步事项是要通过主线程才能操作的。这样就引出了一个子线程怎么去通知主线程要做哪些事情呢? 为了解决上面的问题我找了好的多资料,好多都是用委托,去解决了,然后我又看了我的项目通过这种beginI
c# 主线程传入一个对象到子线程
我想把多个参数从主线程传到子线程,于是我创建了一个类,把这个类的对象传入到子线程,但是传入后,发现参数是空的,我是把对象强转成object的,我的代码在下面,求大神指点。。。,还有传到子线程的object,怎么又转换成对象呢????rnValThread val = new ValThread();//创建类的对象rnval.threadsockt = mainSockt;rnval.num = mainNum;//对对象的成员赋值rnobject objectVal = (object)val;//把对象强转成0bject类型(我调试时,发现就是这条语句错了,求指点。。。)rnthread.Start(objectVal);//启动线程,并把参数传入到子线程
c#主线程如何知道子线程执行结束
启动50个线程执行其它任务,主线程无限循环监控子线程的一些参数变化,我用什么主线程才能得知子线程已经执行完了?请教高手
子线程,主线程
1. - (id)performSelector:(SEL)aSelector; - (id)performSelector:(SEL)aSelector withObject:(id)object; - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; 这三个方法,均为同步执
主线程子线程
package com.lxxu.testthread; public class ThreadDemo7{ public static void main(String[] args){ System.out.println(&quot;任务一&quot;); System.out.println(&quot;任务二&quot;); new Thread(()-&amp;gt;{//子线程 int temp = 0; ...
C# Winform 主线程子线程问题
[code=csharp] public class Staticrn rn public static Form2 f2 = new Form2();rn public static string txt = "";rn public static bool isshow = false;rn rnrnrnrn public partial class Form1 : Formrn rn public Form1()rn rn InitializeComponent();rn rnrn private void Form1_Load(object sender, EventArgs e)rn rn Static.isshow = true;rn Thread td = new Thread(new ThreadStart(Shows)); rn td.Start();rn rn private void Shows()rn rn while (Static.isshow)rn rn Static.f2.Show();rn rnrn rn[/code]rnrnrn这样做副线程回不到主线程!如何让form1和form2分属于两个不同线程,form1 可以向form2传递值,但是form2执行的东西不会影响form1线程!
C#主线程如何访问子线程 局域网通讯
我创建了一个子线程用来进行socket连接 我发送消息用文本框 下面问题来了 文本框的知如何传给子线程的socket发送部分啊 或是我这种写法就不对在创建别的线程啊
c#主线程如何获取活着的子线程的个数
代码如下:rn[code=C#]rn Thread[] tt = new Thread[ThreadNum];rn for (int i = 0; i < ThreadNum; i++)rn rn tt[i] = new Thread(new ParameterizedThreadStart(ThreadStart));rn tt[i].Name = "id" + i;rn tt[i].Start(tt[i].Name);rn rnrn[/code]rnrn线程数组中的线程可能执行完了,我的主线程如何获取活着的子线程的个数?
c# 子线程如何通知主线程,使主线程做出响应?
我要实现的功能如下:rnrn程序中有2个线程,主线程和子线程,rn主线程中有一个变量:Xrn主线程运行中激活子线程,子线程会做出计算改变 X 的值,rn主线程继续做其它的事,直到 X 的值发生改变时,才会响应,并在textbox中输出 X 的值(这一过程中主线程并不知道何时X的值才会变,它不能循环等待,必须去做别的事,比如接收用户点击等等)。rnrn这个功能看起来简单,但是我始终找不到方法,我对委托和事件理解的还不透,不知道能不能用事件解决?rn期待各位高手解答rnrn
如何主线程等待子线程关闭?
rn [size=24px]现在我在子线程播放视频中,可是想要在主线程中重新打开新的视频,这时候应该首先关闭旧线程,同时等待线程关闭后重新创建新的线程,应该怎么做比较合适?rn 我现在的查到的方法是首先阻塞子线程,然后设置退出while循环,然后在run函数结束时发送finished信号,这时主线程捕获信号再在槽中重新创建子线程,这样可行不? 还有其他方法吗?[/size]
子线程如何请求主线程调用函数?
本人写了一个timer类,我想让他每隔一段时间激发事件.功能和工具箱的Timer一样rn[code=VB.NET]rnClass Timerrn Dim th As Threading.Threadrn Event OnTimer()rnrn Sub New()rn th = New Threading.Thread(AddressOf Work)rn th.IsBackground = Truern th.Start()rn End Subrnrn Sub Work()rn Dorn Threading.Thread.Sleep(1000)rn RaiseEvent OnTimer()rn Looprn End SubrnEnd Classrn[/code]rnrn在Form响应OnTimer()事件代码如下:rn[code=VB.NET]rnsub OnTimer() Handles MyTimer.OnTimerrn if Me.InvokeRequired then rn me.text=now.toStringrn elsern dim d as new dlgOnTimer(addressof OnTimer)rn me.Invoke(d)rn end ifrnend subrn[/code]rnrn我现在想问,如何在子线程里直接请求主线程执行事件代码?即上面的代码可以简化成一句rn[code=VB.NET]rnme.text=now.toStringrn[/code]rn我不想用CheckForIllegalCrossThreadCalls来做.因为很多时候会引起莫明的错误!
如何实现主线程和子线程间通信?
public delegate void excute(string _message);rn public partial class Form1 : Formrn rn rn public Form1()rn rn InitializeComponent();rn rn rnrn private void button1_Click(object sender, EventArgs e)rn rn dd temp = new dd();rn temp.dgExcute = new excute(show);rn Thread thred = new Thread(new ThreadStart(temp.doit));rn thred.Start();rn rnrn void show(string _message)rn rn lock (this.textBox1)rn rn this.textBox1.Text = _message;rn rn rn rn public class ddrn rn public excute dgExcute;rn public void doit()rn rn int c=0;rn for (int i = 1; i < 10000; i++)rn rn c += i;rn dgExcute(c.ToString());rn rn dgExcute(c.ToString()+" 计算完成");rn rn rnrn这段代码在VS2005中无法通过,提示“未处理 System.InvalidOperationExceptionrn Message="线程间操作无效: 从不是创建控件“textBox1”的线程访问它。"”rnrn怎样才能在将子线程的计算结果传回主线程?
子线程如何修改主线程的变量?
下面的demo,实现的思路是:让子线程发个信号给主线程,主线程的相应槽函数做出反应。rnrn这不是与MFC的思路大相径庭了?rnrn[code=C/C++]#include "mainwindow.h"rnrnMainWindow::MainWindow(QWidget *parent)rn : QMainWindow(parent)rn , m_thread(NULL)rn , m_count(100)rnrn m_button = new QPushButton(this);rn m_button->move(0, 25);rnrn m_label = new QLabel(this); rn m_label->move(100, 35);rn QString str = QString::number(m_count);rn m_label->setText(str);rnrn qDebug("this is a 111");rn m_thread = new MyThread();rnrn QObject::connect(m_button, SIGNAL(clicked()), this, SLOT(OnClicked()));rn QObject::connect(m_thread, SIGNAL(mystep()), this, SLOT(OnSlot()));rnrnrnMainWindow::~MainWindow()rnrnrnrnrnvoid MainWindow::OnClicked()rnrn qDebug("this is a 222");rn m_thread->start();rnrnrnvoid MainWindow::OnSlot()rnrn qDebug("this is a 444");rn ++m_count;rn QString str = QString::number(m_count);rn m_label->setText(str);rnrnrnvoid MyThread::run()rn rn qDebug("this is a 333");rn emit mystep();rn rn[/code]
子线程如何访问主线程的全局变量
希望能举例说明
主线程如何等待子线程退出?
主线程如何等待子线程退出?
子线程如何获得主线程的句柄?
rn从子线程向主线程发消息,FindWindow()是获得窗口句柄, 还有方法可以获得主线程的句柄吗? rnrnrnwhd=FindWindow(NULL,"MainForm"); rn
主线程如何捕获子线程的异常
"java大数据培训学校全套教材"系列课程由750集视频构成,基本就 是1)时下流行的java培训学校主流内部教材,2)和市面上培训学校的通 行的课程体系几乎一样。所以这套课程都能自己学下来,等于上了培训学 校一次,完全可以找个java工程师的工作了。rn 本门课程为"java大数据培训学校全套教材"系列课程的第七篇,通过学线程,线程安全,死锁等相关概念,让大家对线程编程打下好的基础。
子线程如何向主线程发信号??
手上做个东西,需要让子线程给主线程发送信号来告知自己的状态。但是发现pthread_kill要带threadID的参数,那如果子线程调用这个函数给主线程发信号,这个threadID该填什么值呢??
我的主线程控制以及子线程同步的问题
本人程序中一个主线程开出两个子线程A和B,并且A和B传入的是同一个参数(结构),假如说A线程出现了一个错误,退出该线程,此时主线程发现了这个错误,删除了这个参数,而B子线程由于并不知道A已退出,而且主线程删除了该传入参数,所以B仍然运行,必然产生了一个错误,Violate Access,请问如何实现A和B之间的同步,使得A退出后,B也可以退出该线程呢?rn注1:不要跟我说用全局量!rn注2:我现在用tryrnrn rn rn catch(...)rn rn         return 0;rn rn来解决B问题的
相关热词 c# 线程顺序 c#昨天当前时间 c# 多进程 锁 c#mysql图片存取 c# ocx 委托事件 c# 读取类的属性和值 c# out 使用限制 c#获取url的id c#怎么进行分页查询 c# update 集合