当前位置:编程学习 > C#/ASP.NET >>

事件同步问题

现在有一主线程A,其中定义了serialport类型对象S,然后在主线程中调用辅线程B,在B中执行一个操作,例如给S发送一个字节流。此时S的datareceived事件自动触发,也就相当于在B中执行了一个动作后,CLR后台启动一个线程事件

最后,我在datareceived中对B中定义的变量D赋值

目前要实现的目的是,为了放置线程不同步,我在A中调用B后,使用join方法让A等B结束后继续执行后续操作。但发现个问题:join后A是可以等B,但B中的datareceived一旦触发后,从B中触发datareceived的地方B继续执行后续操作,datareceived本身作为另外第三层线程也在同步执行。由于我是在datareceived中对B中定义的变量D进行赋值操作的。这个时候由于B并不等datarecevied执行完后才返回到A,所以最后在A中获取的D的值与预期的不一样

说白了一句话:主线程中使用辅线程的join方法不能让辅线程等待辅线程中开辟的事件结束后一同返回主线程。

想了想,C#提供的mutex、monitor、lock、autoresetevent以及semaphore这些同步基元基本都解决不了此问题。请教论坛上线程熟悉的朋友,此问题有何好的解决方式方法,谢! --------------------编程问答-------------------- 试试BackGroudWork(Event: DoWork,RunWorkerCompleted) --------------------编程问答-------------------- d帮顶 --------------------编程问答-------------------- up --------------------编程问答--------------------
引用 1 楼 changjiangzhibin 的回复:
试试BackGroudWork(Event: DoWork,RunWorkerCompleted)


cool --------------------编程问答-------------------- 新年快乐 jf --------------------编程问答-------------------- 不是很明白你陈述的问题,不过你的问题我想可以用Event来解决。 --------------------编程问答-------------------- to haiwangstar

  event是通知机制,解决不了

to changjiangzhibin 

  backgroundworker是异步方式,我现在主要的问题是一个线程开了一个以线程方式封装的事件(我们一般的事件都是在主线程上的,而我这里是在辅线程上的),我要达到的目标是线程可以等待事件执行完成再执行后续操作。 --------------------编程问答-------------------- 我现在的问题困惑在,如果辅线程是我主线程自己启动的,我可以在启动后控制辅线程的执行,但现在问题的关键是我的辅线程是主线程一个相关操作导致CLR后台以事件的方式启动了一个线程,我不太清楚,如果是CLR后台以事件方式启动的线程,如果控制可以让主线程停止,直到等到事件结束在返回主线程继续执行。 --------------------编程问答-------------------- 我现在的问题困惑在,如果辅线程是我主线程自己启动的,我可以在启动后控制辅线程的执行,但现在问题的关键是我的辅线程是主线程一个相关操作导致CLR后台以事件的方式启动了一个线程,我不太清楚,如果是CLR后台以事件方式启动的线程,如果控制可以让主线程停止,直到等到事件结束在返回主线程继续执行。 --------------------编程问答-------------------- .net不熟,也没有看过你的S对象是如何实现的,估计是因为datareceived事件本身是一个独立线程(类似于一般的网络控件实现),因为A线程只依赖于B线程的结束,并不受datareceived事件线程(假设为C线程)的影响,所以会有这样的问题,因为你的join只解决了A和B的同步问题,没有考虑到C的同步问题。
建议解决方案:不要用join,而改用一个供三个线程使用的同步锁。
如果A只是等待这个C结束的话,可以这样做:
创建一个Event,然后在A启动B之前RESET这个EVENT,在启动B之后waitfor这个Event。
同样,B线程在触发datareceived事件之后也waitfor这个Event。
最后在C线程结束前Set这个Event即可。
如果A必须等到B结束的话,B就没有存在的必要了,反正A和B根本没有并发执行,多搞个线程出来是自找麻烦。 --------------------编程问答-------------------- 是不是就是"生产者/消费者"问题?一个线程A执行,产生结果,通知另一线程B已产生结果了,让B去处理,B取得A产生的结果,再通知A结果已经取起,可以再次产生一个结果?

的确没有看明白你描述的问题, --------------------编程问答--------------------  如果我没理解错的话,楼主的意思大概时这样 

  Main Thread
    ------>open new Thread
           (new thread waiting)
                     ----->trigger new Event
                                     ----Event doing somethings
           (new thread resume)


   想在线程中判断靠驱动的事件是否执行完毕,完毕后线程才继续执行,时这个意思么?

   
   如果是的话,确实不太好处理,可以考虑lock某个对象,自己去标记所触发的event是否执行完毕了,没有完毕之前,不要释放改对象...
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,