社区
C#
帖子详情
高手请进!!! .net下的事件是同步还是异步?
sarcophile
2003-09-29 02:02:49
1,比如函数a触发事件e,事件处理函数h,那么h和a的剩余部分是不是同步执行的?
2,如果是异步的,是不是在同一线程?
...全文
570
15
打赏
收藏
高手请进!!! .net下的事件是同步还是异步?
1,比如函数a触发事件e,事件处理函数h,那么h和a的剩余部分是不是同步执行的? 2,如果是异步的,是不是在同一线程?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的
JAVA上百实例源码以及开源项目
原理是初始化颜色选择按钮,然后为颜色选择按钮增加
事件
处理
事件
,最后实例化颜色选择器。 Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件...
通俗易懂,什么是
.NET
?什么是
.NET
Framework?什么是
.NET
Core?
.Net
Web开发技术栈...
本文将从上往下,循序渐进的介绍一系列相关
.NET
的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列
.NET
的相关概念,这主要包括:CLS、CTS(CLI)、FCL、Windows下CLR的相关核心组成、Windows...
在JavaScript
异步
和
同步
之间穿梭
在JavaScript
异步
和
同步
之间穿梭 王秋 · 2 年前
异步
和
同步
如果你正在使用JavaScript,那么你对
异步
和
同步
的代码并不会陌生。经常接触到的
异步
的用法很多,比如一个DOM
事件
的调用,一个Ajax请求或是NodeJS中读...
(翻译)
异步
编程:Async/Await在ASP
.NET
中的介绍
本文翻译自:Async Programming - Introduction to Async/Await on ASP
.NET
| Microsoft Docs下面翻译的内容以第一人称进行,由于翻译作者水平有限,有不对的地方请指正 网上很多的教程围绕async/await展开的内容都...
同步
函数与
异步
函数
原文地址:...1.
同步
函数与
异步
函数 什么是
同步
函数? 什么是
异步
函数? 它们在线程中执行时会对线程有何影响? 一个线程如何与一个
异步
执行的函数进行
同步
? 依据微软的MSDN上的解说:
C#
110,536
社区成员
642,578
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章