高手请进!!! .net下的事件是同步还是异步?

sarcophile 2003-09-29 02:02:49
1,比如函数a触发事件e,事件处理函数h,那么h和a的剩余部分是不是同步执行的?
2,如果是异步的,是不是在同一线程?
...全文
570 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sarcophile 2003-10-02
  • 打赏
  • 举报
回复
高。
pcnetman 2003-10-02
  • 打赏
  • 举报
回复
异步通知:轮询

public void DoWork()

{

//...

Console.WriteLine("Worker: work completed");

if( completed != null )

{

foreach( WorkCompleted wc in completed.GetInvocationList() )

{

IAsyncResult res = wc.BeginInvoke(null, null);

while( !res.IsCompleted ) System.Threading.Thread.Sleep(1);

int grade = wc.EndInvoke(res);

Console.WriteLine("Worker grade= " + grade);

}

}

}

【译注:下面给出本节例子完整代码:

using System;

delegate void WorkStarted();

delegate void WorkProgressing();

delegate int WorkCompleted();

class Worker

{

public void DoWork()

{

Console.WriteLine("Worker: work started");

if( started != null ) started();

Console.WriteLine("Worker: work progressing");

if( progressing != null ) progressing();

Console.WriteLine("Worker: work completed");

if( completed != null )

{

foreach( WorkCompleted wc in completed.GetInvocationList() )

{

IAsyncResult res = wc.BeginInvoke(null, null);

while( !res.IsCompleted ) System.Threading.Thread.Sleep(1);

int grade = wc.EndInvoke(res);

Console.WriteLine("Worker grade= " + grade);

}

}

}

public event WorkStarted started ;

public event WorkProgressing progressing;

public event WorkCompleted completed;

}

class Boss

{

public int WorkCompleted()

{

System.Threading.Thread.Sleep(3000);

Console.WriteLine("Better...");

return 6; /* out of 10 */

}

}

class Universe

{

static void WorkerStartedWork()

{

Console.WriteLine("Universe notices worker starting work");

}

static int WorkerCompletedWork()

{

System.Threading.Thread.Sleep(4000);

Console.WriteLine("Universe is pleased with worker's work");

return 7;

}

static void Main()

{

Worker peter = new Worker();

Boss boss = new Boss();

peter.completed += new WorkCompleted(boss.WorkCompleted);

peter.started += new WorkStarted(Universe.WorkerStartedWork);

peter.completed += new WorkCompleted(Universe.WorkerCompletedWork);

peter.DoWork();

Console.WriteLine("Main: worker completed work");

Console.ReadLine();

}

}

/*

以下是上段程序输出结果:

Worker: work started

Universe notices worker starting work

Worker: work progressing

Worker: work completed

Better...

Worker grade = 6

Universe pleased with worker's work

Worker grade = 7

Main: worker completed work //【译注:注意这个结果到最后才输出,下一节首句意思即是如此】

*/



异步通知:委托

public void DoWork()

{

//...

Console.WriteLine("Worker: work completed");

if( completed != null )

{

foreach( WorkCompleted wc in completed.GetInvocationList() )

{

wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);

}

}

}

private void WorkGraded(IAsyncResult res)

{

WorkCompleted wc = (WorkCompleted)res.AsyncState;

int grade = wc.EndInvoke(res);

Console.WriteLine("Worker grade= " + grade);

}

【译注:下面给出本节例子完整代码:

using System;

delegate void WorkStarted();

delegate void WorkProgressing();

delegate int WorkCompleted();

class Worker

{

public void DoWork()

{

Console.WriteLine("Worker: work started");

if( started != null ) started();

Console.WriteLine("Worker: work progressing");

if( progressing != null ) progressing();

Console.WriteLine("Worker: work completed");

if( completed != null )

{

foreach( WorkCompleted wc in completed.GetInvocationList() )

{

wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);

}

}

}

private void WorkGraded(IAsyncResult res)

{

WorkCompleted wc = (WorkCompleted)res.AsyncState;

int grade = wc.EndInvoke(res);

Console.WriteLine("Worker grade= " + grade);

}

public event WorkStarted started ;

public event WorkProgressing progressing;

public event WorkCompleted completed;

}

class Boss

{

public int WorkCompleted()

{

System.Threading.Thread.Sleep(3000);

Console.WriteLine("Better...");

return 6; /* out of 10 */

}

}

class Universe

{

static void WorkerStartedWork()

{

Console.WriteLine("Universe notices worker starting work");

}

static int WorkerCompletedWork()

{

System.Threading.Thread.Sleep(4000);

Console.WriteLine("Universe is pleased with worker's work");

return 7;

}

static void Main()

{

Worker peter = new Worker();

Boss boss = new Boss();

peter.completed += new WorkCompleted(boss.WorkCompleted);

peter.started += new WorkStarted(Universe.WorkerStartedWork);

peter.completed += new WorkCompleted(Universe.WorkerCompletedWork);

peter.DoWork();

Console.WriteLine("Main: worker completed work");

Console.ReadLine();

}

}

/*以下是上段程序输出结果:

Worker: work started

Universe notices worker starting work

Worker: work progressing

Worker: work completed

Main: worker completed work //【译注:异步委托发生了效果,因此这一行先输出啦J】

Better...

Worker grade = 6

Universe pleased with worker's work

Worker grade = 7

*/

事件是引发的,
是同步的,
可以通过事件(本身是被特殊支持的对象)的方法来实现异步。
kuangren 2003-10-02
  • 打赏
  • 举报
回复
多线程不就可以同步罗~
sarcophile 2003-10-02
  • 打赏
  • 举报
回复
再顶一下,没有别的高见了吗?
herakless 2003-09-30
  • 打赏
  • 举报
回复
当然a 和 on_e 就在同一线程了
herakless 2003-09-30
  • 打赏
  • 举报
回复
h的剩余部分要等a返回后才执行,和函数调用差不多,跟踪反汇编就知道了
sarcophile 2003-09-30
  • 打赏
  • 举报
回复
1,
jjcccc说: 一般情况h的剩余部分要等a返回后才执行,---- 就是说是同步
cnhgj(戏子)说: 事件是异步,
我:头大。能不能给个证据先?

2,以下说法是我的理解,对不对?
如果两个线程访问同一个全局变量,一定要加锁。要访问同一个函数,应该是给函数中的以下部分加锁:访问全局变量,静态变量,所在实例的成员变量。因为不同线程使用的是这些变量的同一个内存地址。
而以下部分不用加锁:new分配的,动态局部变量。因为new分配的变量每个线程运行时都有新的分配(c++中变量名称作为指针实际是局部变量),而局部变量在堆栈中,每个线程有自己的堆栈,互不干扰。
3,事件处理函数和触发事件的函数是否在同一线程?比如
a(void)
{
event e;
e();//触发事件
}
on_e(void)//事件处理函数
{}
函数 a 和 on_e 是否在同一线程中?
Reeezak 2003-09-29
  • 打赏
  • 举报
回复
就是阿
这个就是线程同步的问题阿(不知道应该怎么解释,跟楼主说的已经不一样了)
9tl 2003-09-29
  • 打赏
  • 举报
回复
如果两个线程分别触发同一个事件,好象其中有一个还是要加锁的!
Reeezak 2003-09-29
  • 打赏
  • 举报
回复
事件用异步
同步用线程
这个解释够明白吧?
^_^
cnhgj 2003-09-29
  • 打赏
  • 举报
回复
事件是异步,要同步可以用线程
xiaha3 2003-09-29
  • 打赏
  • 举报
回复
http://www.csdn.net/develop/article/15/15850.shtm
sarcophile 2003-09-29
  • 打赏
  • 举报
回复
2,换个说法:如果两个线程分别触发同一个事件,那么这个事件的处理函数是不是需要加锁?
sarcophile 2003-09-29
  • 打赏
  • 举报
回复
就是说一般情况下相当于函数调用了?
特殊情况得看你在a中是怎样触发h的????
具体什么意思?
jjcccc 2003-09-29
  • 打赏
  • 举报
回复
1.一般情况h的剩余部分要等a返回后才执行,特殊情况得看你在a中是怎样触发h的

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧