日期:2014-05-18  浏览次数:20923 次

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

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

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

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

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

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

------解决方案--------------------
在线程中访问界面控件需要通过委托实现,
如设置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 = "张三";
------解决方案--------------------
好奇怪的说法哦!

只有线程执行方法的。
方法可以被任意线程执行,因为方法其实只是一段代码。
当然在方法内有对于上下文的要求。

在 C# 内部,有线程单元的要求。
界面的操作都要求在创建她的线程内执行。
所以,如果你的事件中有对于界面元素的操作,都需要Invoke 或者 BeginInvoke。

其实,你可以添加一个Invoke 包装来执行跨线程操作。但是,最终都是需要 Invoke 家族函数。
类似 线程的 Dispatcher。