天天看点

C# 多线程参数传递

1、通过实体类来传递(可以传递多个参数与获取返回值),demo如下:

需要在线程中调用的函数:

通过实体来来封装:

调用:

小注:

必须注意isbackground的问题,如果isbackground为false的,则windows程序在退出的时候,不会为你自动退出该线程。也就是实际上你的应用程序未结束。

这种方法的优点是,任何时候想要启动新线程,都可以创建类的新实例,该实例带有自身的参数。

threadstart中的函数是没有返回值和参数的

2、异步调用中的参数和返回值

能完美解决参数和返回值的是使用异步调用的方式。异步调用和thread相比,一个最大的劣势是不能控制其优先级。 

具体代码如下:

简化:

通过这种方式生成新线程是运行在后台的(background),优先级为normal

3、使用 backgroundworker

多线程返回值最简单方法是:使用 backgroundworker 组件来管理线程,在任务完成时引发事件,然后用事件处理程序处理结果。

backgroundworker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作。

在应用程序中添加一个backgroundworker实例,如果用的是vs,可以从工具上直接拖到应用程序:

       为了开始在后台操作,必须调用backgroundworker的runworkerasync()方法,当调用此方时,backgroundworker 通过触发dowork 事件,开始执行后台操作,dowork 事件的代码是在另一个线程里执行的。

       当后台操作完成以后,无论是completed 还是cancelled,则runworkercompleted 事件被触发,通过此方法可以将后台操作的完成结果反馈给用户。

       另外,通过runworkercompletedeventargs实例的cancelled 属性,以判断是否是cancel操作使得后台操作终止。

具体demo如下:

4、如果不如返回值的时候,应该怎么优雅的写呢?匿名函数啊

C# 多线程参数传递

functionclass类新增,测试函数如下:

调用如下:

如果通过wcf来调用的话,应该把起线程的函数放到服务端,如果放到客户端,很容易因为wcf客户端的时间限制,造成造成主程序的莫名崩溃。

崩溃的原因主要是客户端wcf响应时间是有限制。