C#中事件可以重进入吗,即A事件在执行,同时B
1个回答
展开全部
C#中大部分情况使用提“多播”方式的事件。也就是通过+=进行事件绑定,但一般情况下多播事件是顺次执行的,也就是按照+=绑定的事件顺序进行执行。当然你也可以随时使用-=进行解绑。
所以事件(实际上是一个委托),多播事件是多个委托进行顺次执行。所以从严格的角度上说A事件在执行时,B不可能在同时也在执行!我这里有两个关键词:严格概念角度和事件(委托)。但在业务角度上来说,A业务在执行的过程中B是可以同时执行的。事实上我们知道多谓的多播也是开个线程而已,然后依次执行。我来解释一下为什么多播事件不可以同时执行,但两个业务可以同时执行——我假定你的A事件开一条线程去做A业务,B事件开辟一个新线程执行B业务,那么A事件在结束后,A事件的线程尚未结束,但完全可以执行B事件,而B事件在A事件完成后当然可以开新线程执行B业务,那么此时的状态是A/B两个业务同时执行,但A事件与B事件可能已经结束了!所以,从严格的概念角度上来,AB事件肯定有先后执行顺序的,所以不可能同时有两个事件在执行——但没有说不能有两个业务线程在执行!所以对于你这个问题,从严格概念上来说,多播事件肯定是按委托的绑定顺序执行,不可能出现两个委托同时进行。如果你有类似的需求,那么两种方案可供你选择:
在一个事件中定义两个业务线程:即你的A/B事件都做为一条线程在新的事件中同时开辟(一个线程中开辟多个线程是完全没有问题的)。这种情况并不影响OOP编程思想。
另一种情况就是定义的AB事件中各开一条线程,分别实现不同的业务。正如我上边所讲。该种方案中其实使用是APM(异步编程思想)的思想而已。也就是说AB业务线程分别都是异步线程,不要开同步线程,否则A线程结束后A事件才结束。
所以在编程时要注意,框架是已经定义的,如何使用是一个程序员的能力,而不是想如何在已经存在的框架上去修改,比如你此时肯定在想有什么方法能让两个事件(委托,不是业务线程)同时执行?难道不能同时执行就没有框架不适用或选错了编程语言?这些都不对的!
所以事件(实际上是一个委托),多播事件是多个委托进行顺次执行。所以从严格的角度上说A事件在执行时,B不可能在同时也在执行!我这里有两个关键词:严格概念角度和事件(委托)。但在业务角度上来说,A业务在执行的过程中B是可以同时执行的。事实上我们知道多谓的多播也是开个线程而已,然后依次执行。我来解释一下为什么多播事件不可以同时执行,但两个业务可以同时执行——我假定你的A事件开一条线程去做A业务,B事件开辟一个新线程执行B业务,那么A事件在结束后,A事件的线程尚未结束,但完全可以执行B事件,而B事件在A事件完成后当然可以开新线程执行B业务,那么此时的状态是A/B两个业务同时执行,但A事件与B事件可能已经结束了!所以,从严格的概念角度上来,AB事件肯定有先后执行顺序的,所以不可能同时有两个事件在执行——但没有说不能有两个业务线程在执行!所以对于你这个问题,从严格概念上来说,多播事件肯定是按委托的绑定顺序执行,不可能出现两个委托同时进行。如果你有类似的需求,那么两种方案可供你选择:
在一个事件中定义两个业务线程:即你的A/B事件都做为一条线程在新的事件中同时开辟(一个线程中开辟多个线程是完全没有问题的)。这种情况并不影响OOP编程思想。
另一种情况就是定义的AB事件中各开一条线程,分别实现不同的业务。正如我上边所讲。该种方案中其实使用是APM(异步编程思想)的思想而已。也就是说AB业务线程分别都是异步线程,不要开同步线程,否则A线程结束后A事件才结束。
所以在编程时要注意,框架是已经定义的,如何使用是一个程序员的能力,而不是想如何在已经存在的框架上去修改,比如你此时肯定在想有什么方法能让两个事件(委托,不是业务线程)同时执行?难道不能同时执行就没有框架不适用或选错了编程语言?这些都不对的!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询