文档章节

.NET 同步 异步 委托

rhythmk
 rhythmk
发布于 2014/08/16 16:36
字数 332
阅读 7
收藏 0

1、定义委托:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;

namespace DelegateWebApp
{

    /// <summary>
    /// 定义委托
    /// </summary>
    /// <param name="i"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    public  delegate int SumDelegate(int i,int y);

    public class CounterService
    {
        
        public int Sum(int i,int y)
        {
            return i + y;
        }


        /// <summary>
        /// 异步等待
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public int WaitSum(int a, int b)
        {

            for (var i = 0; i < 50; i++)
            {
                System.Threading.Thread.Sleep(1000);
                WriteLog("WaitSum 执行时间:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");
              
            }

            return a + b;
        }


        /// <summary>
        /// 日志记录
        /// </summary>
        /// <param name="msg"></param>
        public  static void WriteLog(string msg)
        {
            // 此处不能通过 Server.Map 去获取对象
            string realPath = AppDomain.CurrentDomain.BaseDirectory+"/log.txt";
            FileStream fsWriter = null;
            if (!File.Exists(realPath))
            {
                fsWriter = new FileStream(realPath, FileMode.Create);
            }
            else
            {
                fsWriter = new FileStream(realPath, FileMode.Append);
            }
            StreamWriter sw = new StreamWriter(fsWriter);//实现一个类,向流中写入字符
            sw.WriteLine(msg);//写入流
            sw.Close();//类关闭
            fsWriter.Close();//流关闭
        }
    }
}

  

2、调用方法:

  同步:

  

CounterService.WriteLog("同步调用开始:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");
            CounterService counterService=new CounterService ();
            SumDelegate sumDellegate = new SumDelegate(counterService.Sum);
            lbResult.Text=sumDellegate(10,20).ToString();
            CounterService.WriteLog("同步调用完成:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");

  

  异步:

   

Action<IAsyncResult> action=(x)=>{
                CounterService.WriteLog("异步调用Action开始:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");

                SumDelegate handler = (SumDelegate)((System.Runtime.Remoting.Messaging.AsyncResult)x).AsyncDelegate;
                lbResult.Text = handler.EndInvoke(x).ToString() + ";" + x.AsyncState;
                CounterService.WriteLog("异步调用Action结束:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");
          
            };

            CounterService.WriteLog("结果输出时间:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");
            lbSync.Text = "结果输出,但异步委托还在执行";

            CounterService.WriteLog("异步调用开始:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");

            CounterService counterService = new CounterService();
            SumDelegate sumDellegate = new SumDelegate(counterService.WaitSum);
            IAsyncResult asyncResult = sumDellegate.BeginInvoke(10, 30, new AsyncCallback(action), "OK:" + DateTime.Now.TimeOfDay.ToString());
            CounterService.WriteLog("异步调用完成:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");

代码下载地址:

 

© 著作权归作者所有

rhythmk
粉丝 1
博文 62
码字总数 40987
作品 0
广州
私信 提问
C# 异步调用与线程总结

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

鉴客
2011/07/21
5.9K
0
Control.Invoke和Control.BeginInvoke简述

出自: http://blog.csdn.net/chenlu1982/article/details/2102692 1.背景介绍 在Windows Form中使用多线程时,除了创建控件的线程以外(就是主线程),绝对不要在任何其他线程里面调用控件的...

长平狐
2013/03/28
108
0
5.5 异步TCP编程举例(一)

本小节通过设计一个和例5-1相同网络聊天功能的程序来说明如何编写异步TCP应用程序。之所以在这个例子中仍然完成和同步聊天相同的功能,是为了让读者能通过代码更好地体会同步和异步之间的差别...

张金富
2012/07/10
551
0
一位牛人的多线程和异步调用文章

转自小顾问原文 一位牛人的多线程和异步调用文章 首先申明:这篇文章不是我写的,我看到的一位牛人的,自己慢慢的消化了…… 摘要:本章讨论与智能客户端应用程序中多线程的使用有关的问题。...

橘子红了呐
2017/11/13
0
0
阅读《LEARNING HARD C#学习笔记》知识点总结与摘要五

本篇文章主要是总结异步编程的知识点,也是本系列的最后一篇文章,每一个知识点我都有写出示例代码,方便大家理解,若发现有误或不足之处还请指出,由于书中作者对此知识点讲解过于简单,所以...

技术小牛人
2017/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
19分钟前
2
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
29分钟前
2
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
30分钟前
2
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
36分钟前
6
0
IDEA 自定义方法注解模板

IDEA 自定义方法注解模板 1、使用效果 /*** 计算交易费用* @Author wangjiafang* @Date 2019/9/11* @param feeComputeVo* @return*/@PostMapping("/v1/fee_compute")public ApiResp......

小白的成长
36分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部