C#有时候在子线程里面无法调用函数

C#有时候在子线程里面无法调用函数,第1张

一般是因为你在子线程里试图 *** 作主线程 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秒周期以上的定时器基本可以保障精度。 如果窗口内消息阻塞或者定时器

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12176233.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存