
一般是因为你在子线程里试图 *** 作主线程 UI 了,比如对某个控件的属性中取值或赋值、调用某个控件的方法之类的,这种非线程安全的 *** 作模式是被禁止的。
请百度“C# 跨线程 *** 作控件”。
waitcallback委托是将任务排入队列以供线程池执行,
threadpoolqueueuserworkitem方法在线程池中创建一个线程池线程来执行指定的方法(用委托waitcallback来表示),并将该线程排入线程池的队列等待执行。
你这么理解可以~~
控件只能在创建它的线程中被直接访问,你的textbox2控件都是在主线程中的,所以用mythread去访问它,就需要用到托管线程(实际上一般叫委托),如果不这样做,直接在setAddFile()里写RunAddFile就会报一个错误(你试一下就知道了)
ThreadSleep(0)就是使当前线程暂停一下,以便其它线程可以取得控制权,abort是中止mythread,这两行在这里没什么意义,可以去掉的。
runaddfile中的power(7,50)那一行就是求7的50次幂放放到textbox2中
如果直接用delegate()或者delegateInvoke()方法,占用的是主线程。
如果使用delegateBeginInvoke()方法,占用的就是线程池里的线程。
全局静态变量
直接改变就可以
否则需要用委托
类似如下:
主线程A{
赋值事件setaa()
}
子线程B
{
委托对象
bb
}
//A的对象a的处理
a{
bbb+=
setaa
;
}
//B的对象b的处理
b{
需要赋值的地方
if(bb!=null)
{
aInvoke(bb);
}
}
具体的思路就是
B通过委托调用了A自己的方法修改了A内部的值
========================
补充一点,当aInvoke的时候
主线程最好不要是阻塞状态,否则将导致
Invoke进去以后也是阻塞的
首先,当主线程创建的时候,会建立一个Looper对象,
然后子线程执行到需要主线程调用某方法的时候,会将Message加入到一个MessageQueue队列,
Looper对象所属的线程在LooperLoop方法中循环执行从MessageQueue队列读取Message对象
当读取到Message的时候,就会调用主线程中的相应方法
当用户单击控件,或者鼠标停留在某个区域,将产生一个事件,事件由控件类或窗口类提供,例如Button类当按钮按下时发出通知。
为了编程方便,常将引发事件的程序放在单独的模块或者组件,组件通常是一个类。例如控件类或窗口类都是单独的类。当发生事件时,发送类(或称控件类)将事件通知主程序类或接受类,并传递有关的参数。执行通知的手段是绑定一个方法,接受类将方法绑定到发送类的事件,当发送类发事件时,接受类中绑定到事件的方法被执行。
事件是委托类型,可以采用加法赋值运算符+=将方法和事件绑定。你可以查看WinForm程序的Designercs,里面的控件处理程序都是+=符号绑定事件处理程序。接收类必须具有与事件相同签名(如委托签名)的方法。然后,该方法(称为事件处理程序)可以采取适当的 *** 作来响应事件。但是编程员不需要事先费力地在接受类构造绑定事件的方法,当输入符号+=时,编程系统提示按Tab键自动添加绑定方法的名称,第二次按Tab键自动添加方法的参数,并与发送类的委托签名一致。
NET Framework中事件的签名,通常第一个参数为引用事件源的对象,第二个参数为一个传送与事件相关的数据的类。但是在C#语言中并不强制使用这种形式,只要事件签名返回void,其他方面可以与任何有效的委托签名一样。
关键字event声明事件。委托是事件的基础,事件的类型必须是委托类型,因此声明事件前先声明委托。一个简单的例子如下:
public delegate void Handler
class test
{
public event Handler OnClick;
}
这里先在类的外部声明委托Handler,然后在类的内部用关键字event声明事件,也可以在类的内部声明委托。OnClick是Handler类型,由委托Handler代理事件的实现,封装一个方法实现事件。
委托返回类型必须是void,但可以带有参数,例如:
public delegate void TestEventDelegate(object sender, SystemEventArgs e);
事件和方法一样具有签名,签名包括名称和参数列表。事件的签名通过委托类型来定义,委托的参数列表就是事件的列表。
因篇幅有限,不能举例说明,请看我的博客,在百度网页栏目搜163博客danyaody,第3章例3-14。
无论是使用回调函数还是使用系统消息响应,实际上SetTimer都是发送WM_TIMER消息到窗口消息环,并由消息环完成处理。 如果窗口内消息没有阻塞,那么定时器误差在50ms之内,01秒周期以上的定时器基本可以保障精度。 如果窗口内消息阻塞或者定时器
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)