zoukankan      html  css  js  c++  java
  • 委托的异步调用示例(1)

    2008-06-29 20:18

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;

    namespace 委托的异步调用
    {
        public delegate void DelegateClass();//定义委托分类DelegateClass
        class Starter
        {
            static void Main(string[] args)
            {
                DelegateClass del = MethodA;//定义委托对象del
                DelageteStateBag state = new DelageteStateBag();//状态值state
                IAsyncResult ar = del.BeginInvoke(Callback, state);// 开始委托的异步调用
               
                if (ar.IsCompleted == true)
                    Console.WriteLine("MethodA completed");
                else
                    Console.WriteLine("MethodA not completed");
                ar.AsyncWaitHandle.WaitOne();

                Thread.Sleep(100);
                lock(state)
                {
                    Console.WriteLine("Back in Main");
                    Console.WriteLine(state.message);

                }
            }
            /// <summary>
            /// 完成异步委托时的调用方法
            /// </summary>
            /// <param name="ar"></param>
            public static void Callback(IAsyncResult ar)
            {
                DelageteStateBag state = (DelageteStateBag)ar.AsyncState;
                lock (state)
                {
                    Console.WriteLine("Callback Running");
                    ((DelageteStateBag)ar.AsyncState).message = "state object modified in callback.";
                }
            }
            public static void MethodA()
            {
                Console.WriteLine("MethodA running ....");
                Thread.Sleep(200);
            }
         }
        class DelageteStateBag
        {
            public string message;
        }
    }
    //注:Main()方法末尾有一个thread.sleep()语句,该语句如果被删除,在Main()和CallBack()
    //例程间会存在竞争。因为 ar.AsyncWaitHandle.WaitOne()语句产生阻塞,当MethodA()执行完成时,阻塞消失 ,
    //Main()和CallBack()都将继续,竞争开始。Main()Sleep()之后,允许CallBack()允许为共享的state对象加锁。


    作者:玄魂
    出处:http://www.cnblogs.com/xuanhun/
    原文链接:http://www.cnblogs.com/xuanhun/ 更多内容,请访问我的个人站点 对编程,安全感兴趣的,加qq群:hacking-1群:303242737,hacking-2群:147098303,nw.js,electron交流群 313717550。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    关注我:关注玄魂的微信公众号

  • 相关阅读:
    [css]浮动造成的影响
    [py]django的manytomany字段和后台搜索过滤功能
    [py][lc]python高阶函数(匿名/map/reduce/sorted)
    [py][lc]python的纸牌知识点
    [js]js中类的继承
    [js]js杂项陆续补充中...
    [js]js设计模式小结
    WP10的一点小问题
    JS 判断滚动底部并加载更多效果。。。。。。。。。
    This assembly may have been downloaded from the Web. ......
  • 原文地址:https://www.cnblogs.com/xuanhun/p/1662386.html
Copyright © 2011-2022 走看看