C#同步调用和异步调用

首先,通过代码定义一个委托和下面三个示例将要调用的方法:


   public   delegate   int  AddHandler( int  a, int  b);
    
public   class  加法类
    {
        
public   static   int  Add( int  a,  int  b)
        {
            Console.WriteLine( " 开始计算: "   +   +   " + "   +  b);
            Thread.Sleep( 3000 );  // 模拟该方法运行三秒
            Console.WriteLine( " 计算完成! " );
            
return   +  b;
        }
    }

 

 

同步调用

委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。

public   class  同步调用
{
        
static   void  Main()
        {
            Console.WriteLine( " ===== 同步调用 SyncInvokeTest ===== " );
            AddHandler handler  =   new  AddHandler(加法类.Add);
            
int  result  =  handler.Invoke( 1 2 );

            Console.WriteLine( " 继续做别的事情。。。 " );

            Console.WriteLine(result);
            Console.ReadKey();
        }
        

}

同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了。
 

 

异步调用

异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。
委托的异步调用通过BeginInvoke和EndInvoke来实现。
 

public   class  异步调用
{
        
static   void  Main()
        {
            Console.WriteLine( " ===== 异步调用 AsyncInvokeTest ===== " );
            AddHandler handler  =   new  AddHandler(加法类.Add);

            
// IAsyncResult: 异步操作接口(interface)
            
// BeginInvoke: 委托(delegate)的一个异步方法的开始
            IAsyncResult result  =  handler.BeginInvoke( 1 2 null null );

            Console.WriteLine( " 继续做别的事情。。。 " );

            
// 异步操作返回
            Console.WriteLine(handler.EndInvoke(result));
            Console.ReadKey();
        }
        

}

可以看到,主线程并没有等待,而是直接向下运行了。
但是问题依然存在,当主线程运行到EndInvoke时,如果这时调用没有结束(这种情况很可能出现),这时为了等待调用结果,线程依旧会被阻塞。
 

 异步委托,也可以参考如下写法:

Action < object >  action = (obj) => method(obj);
action.BeginInvoke(obj,ar => action.EndInvoke(ar), null );
简简单单两句话就可以完成一部操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值