+ -
当前位置:首页 → 问答吧 → 请教... 指定某个方法运行的线程

请教... 指定某个方法运行的线程

时间:2011-12-26

来源:互联网

1. 中间层 主线程初始化一个后台线程, 后台线程循环读取一个列表, 并对读取出来的项进行一些操作, 并发出一些事件. 
2. 界面层 主线程挂载这些事件, 并对传过来的参数进行进一步的处理, 包括界面控件操作.

很简单的需求, 但在实现中碰到一个问题. 主线程中的事件处理方法是后台线程去执行的, 当需要操作界面控件时就会出现"不是x控件创建的线程访问.." 异常.

以前都是在界面层才需要将其他线程中的一些对控件的操作委托到主线程中. 用个 Invoker, 或 BackgroupWorker. 中间层需要指定执行方法的线程这种情况以前都没想到过..

刚开始试试 BackgroupWorker, 虽然有点别扭, 但调试过程中发现, 执行 BackgroupWorker 的 ProgressChanged 数据集方法居然是线程池中的空闲线程而不是主线程. 

网上搜了半天, 都没发现有什么方法. 一般就 Invoker/BeginInvoker/BackgroupWorker. 

有没有人遇到过这种情况, 如何处理?
如何指定某个方法运行的线程? 即为想让一个方法在主线程或其他指定的线程.

作者: ybqiing   发布时间: 2011-12-26

顶一下.

作者: ybqiing   发布时间: 2011-12-26

在线程中访问界面控件需要通过委托实现,
如设置label的text属性
先定义一个委托
public delegate void SetLabelText(string value);
实现它
private void SetLabel1Text(string value)
{
  this.label1.Text = value;
}
在线程里需要对label赋值的地方如下调用
if (this.Label.InvokeRequired)//等待异步
  this.Invoke(new SetLabelText(SetLabel1Text), new object[] { "张三"});//通过代理调用刷新方法
else
  this.label1.Text = "张三";

作者: syl120507   发布时间: 2011-12-26

感谢 syl120507 的回答. 不过不符合我要求. 

我这个是在中间层. 中间层的起一个线程做些处理, 然后发出事件, 按你的方式, 我界面的所有挂载事件都需要去调用 this.Invoker... 这个太麻烦了, 而且界面层没必要知道中间层是怎么处理数据的(起线程还是其他..), 我只想把中间层当成一个服务, 界面注册事件, 在需要的时候中间层会触发该事件, 界面得到通知. 

问题是现在中间层 使用后台线程做这个事情. 触发的事件代码也是由后台线程执行, 如果能指定主线程执行代码呢?

作者: ybqiing   发布时间: 2011-12-26