C# 多线程参数传递

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

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

通过实体来来封装:

调用:

小注:

  • 必须注意IsBackground的问题,如果IsBackground为false的,则Windows程序在退出的时候,不会为你自动退出该线程。也就是实际上你的应用程序未结束。
  • MSDN推荐:多线程方法调用提供参数的最好办法是将目标方法包裹在类中,并为该类定义字段,这些字段将被用作新线程的参数。
  • 这种方法的优点是,任何时候想要启动新线程,都可以创建类的新实例,该实例带有自身的参数。
  • BackgroundWorker 类
  • ThreadStart中的函数是没有返回值和参数的

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

具体代码如下:

简化:

小注:

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

3、使用 BackgroundWorker

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

小注:
BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作。
在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序:

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

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

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

具体demo如下:

demo代码来自MSDN:点击打开链接

参考文章:点击打开链接

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

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

调用如下:

小注:

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

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

1 1 收藏 评论

关于作者:寻找"四叶草"

http://blog.csdn.net/jiankunking 个人主页 · 我的文章 · 1 ·   

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部