日期:2014-05-17  浏览次数:20738 次

c#线程:如何在 Thread_B 里面让 Thread_A 执行某个方法?
单纯的实现这一点似乎很简单: 在A线程 里面循环检测一个字段, 变了就执行特定方法, 而B线程 在必要时候修改该字段就行.

我的应用是基于winforms的MVC, 在Model中创建了线程B(比如下载一个文件), 线程B结束时通知Controller, Controller修改对应的View(一个Form,在线程A中).

现在的问题是, 我不希望Controller中的任何方法在UI线程(线程A) 之外被调用( 以免写Controller的人去担心"这个方法会在哪个线程中执行?"), 而线程B只应和Controller打交道.... 那么线程B如何让线程A执行一个方法?

我能想到的思路, 就和开头说的那样: A是UI线程, 在它的Runloop里面检测Controller的某个字段 ... 线程B只需修改该字段......可是如何访问到Runloop ... google不到啊.....



------解决方案--------------------
既然是让A去做,只能是委托了。或者让A轮询去调用。
问题是,为什么要让A去做,而不是B,或者再开一个新线程呢?如果因为A是UI线程,似乎这不是个问题。
------解决方案--------------------
探讨

引用:

感觉还是通过绑定事件(委托)最合适,不知道你所谓的“我不希望Controller中的任何方法在UI线程(线程A) 之外被调用”是什么意思,编写者只需要制定好要触发的事件即可

Model确实使用了事件
C# code

public event EventHandler downloadFinish;


这个事件会在线程B中下载完成时触发,
Con……

------解决方案--------------------
异步回调简单来说就是发出一个回调的请求给另一个线程,但是并不等它实际被调用就不管了。
而那个线程负责去掉用——因为是界面线程自己调用,所以就没有跨线程同步的问题了。

简单来讲,这是一个固定模式,在界面线程中定义好了更新界面的代码,并且作为一个委托,在工作线程中用Control.BeginInvoke调用。具体可以msdn。