关于互斥体,异步委托的讨论

KissXYL 2005-08-02 05:20:32
private delegate void FunHandle(int a,String str);
FunHandle FunDelegate;

object SyncRoot;
private void button1_Click(object sender, System.EventArgs e)
{
FunDelegate = new FunHandle(Fun);
SyncRoot = new object();

object[] objArgs;
objArgs = new object[2];
int i = 15;
String str = "abcd";

objArgs[0] = (object)i;
objArgs[1] = (object)str;

System.Threading.Monitor.Enter(SyncRoot);
BeginInvoke(FunDelegate,objArgs);
int x;
for (x = 0 ; x < 150 ; x ++)
{
x++;
}
MessageBox.Show("主线程" + x.ToString());
System.Threading.Monitor.Exit(SyncRoot);


}
private void Fun(int a,String str)
{
System.Threading.Monitor.Enter(SyncRoot);
int xx;
for (xx = 0 ; xx < 150 ; xx ++)
{
xx++;
}
MessageBox.Show("异步委托函数体内部。" + a.ToString() + "\n" + str + "\n" + xx.ToString());
System.Threading.Monitor.Exit(SyncRoot);

}


以上的代码是我用来测试的,变量命名基本能看明白。不明白的我根贴回复。

//我一直的认识,异步委托就是系统对多线程包装了。当然,可能理解的不对,这次就是证明
这里的问题,就是:我执行过System.Threading.Monitor.Enter(SyncRoot);之后,才调用的异步委托,按道理,异步委托内部,发现互斥体被占用,会阻塞,等互斥体释放。但是,依然是先执行了委托内的代码,然后执行的button1中的代码,为什么?我自己唯一的答案就是,异步委托和调用它的仍然再同一线程?


就此,我可能已经充分表达了我的错误理解,希望大家帮助我吃透这个概念,最好能给予一个异步委托的比较清晰的例子,msdn上的看晕了。 ^_^
...全文
190 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
linuxyf 2005-08-04
  • 打赏
  • 举报
回复
把线程号记录下来看看就知道了,用log4net试试
KissXYL 2005-08-03
  • 打赏
  • 举报
回复
Up
cdo 2005-08-03
  • 打赏
  • 举报
回复
关注
兔子-顾问 2005-08-03
  • 打赏
  • 举报
回复
奇怪了。好像不是多线程的。。
如果委托里写一个很大循环,主线程就会很久无法更新界面,也就是说,主线程被阻塞了。
KissXYL 2005-08-02
  • 打赏
  • 举报
回复
怎么这么冷清。。。。

不是一个线程,那我以上代码调试过程,为什么委托中没有阻塞线程呢?
linuxyf 2005-08-02
  • 打赏
  • 举报
回复
当然不是一个线程
KissXYL 2005-08-02
  • 打赏
  • 举报
回复
1。我以上代码是否执行了一个异步委托。。。。?
2。异步委托和调用异步委托的是否再同一线程?

110,539

社区成员

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

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

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