首页 新闻 会员 周边 捐助

多线程CallContext跨线程的传值

0
悬赏园豆:60 [已解决问题] 解决于 2015-05-07 15:16

我今天在做winform时用到BackgroundWorker异步线程,可是我在完成事件里用CallContext.SetData()存放了数据,可是现在在外面的主线程里想用之前设置的数据,这时候由于上下文改变所以取不到。请问如何在多线程里用CallContext传数据?

々孤星☆泪♂的主页 々孤星☆泪♂ | 初学一级 | 园豆:13
提问于:2013-03-07 23:40
< >
分享
最佳答案
0

父线程的逻辑上下文数据会自动传递给子线程,但是这个过程不会自动向反方向。但是我们可以这样

1、在主线程中缓存当前逻辑上下文:ExecutionContext curExecutionContext = ExecutionContext.Capture();

2、在完成事件里面:ExecutionContext.Run(curExecutionContext, (Object state)=>CallContext.SetData("Name","123")), null);

收获园豆:60
滴答的雨 | 老鸟四级 |园豆:3660 | 2013-03-08 01:17

不好意思,可能我之前没有说的很明白,具体环境:我现在做系统登录,由于在登录时要加载很多数据,所以在点击登录后会等很久。于是,我就用BackgroundWorker做了一个异步,在调用异步前我就显示一个等待框,然后在DoWork里就调用后台方法验证登录以及加载有用的数据,由于这时有一些数据是全局的,我就用CallContext.SetData("Name","张三"进行记录。在完成事件里只是进行窗体的跳转和开始登录页的隐藏和等待框的隐藏。这个时候我在其它页面要用开始存的数据("Name","张三")就始终取不到了。麻烦再帮忙讲一下,谢谢!

々孤星☆泪♂ | 园豆:13 (初学一级) | 2013-03-08 01:39

@々孤星☆泪♂: 但是我认为你只要在主线程中缓存下当前(主线程)的逻辑上下文ExecutionContext,然后再别的线程就对此上下文设置逻辑数据SetData,你在别的页面就可访问逻辑数据,即使你别的页面是子线程他也会继承主线程的逻辑上下文的啊?或则你连取数据也用ExecutionContext.Run() 去取。

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-08 09:01
其他回答(1)
0

如果用Backgroundworker,想从工作线程传送数据到主线程,只需要在DoWork事件中设置e.Result,然后再在RunworkerCompleted事件中同样用e.Result接收数据即可

陈希章 | 园豆:2538 (老鸟四级) | 2013-03-09 20:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册