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、如果不如返回值的时候,应该怎么优雅的写呢?匿名函数啊
functionclass类新增,测试函数如下:
调用如下:
如果通过wcf来调用的话,应该把起线程的函数放到服务端,如果放到客户端,很容易因为wcf客户端的时间限制,造成造成主程序的莫名崩溃。
崩溃的原因主要是客户端wcf响应时间是有限制。