Пример #1
0
        static void DisplayResult(IAsyncResult result)
        {
            string         format           = (string)result.AsyncState;
            AsyncResult    delegateResult   = (AsyncResult)result;
            SampleDelegate delegateInstance = (SampleDelegate)delegateResult.AsyncDelegate;

            Console.WriteLine(format, delegateInstance.EndInvoke(result));
        }
Пример #2
0
        //在回调函数中儿取
        static void DisplayResult(IAsyncResult result)
        {
            string         format           = (string)result.AsyncState; // 就是BeginInvoke的第三个参数
            AsyncResult    delegateResult   = (AsyncResult)result;       //传入的result总是一个AsyncResult实例,可用于获取原来的委托实例,从而可以调用EndInvoke
            SampleDelegate delegateInstance = (SampleDelegate)delegateResult.AsyncDelegate;

            Console.WriteLine(format, delegateInstance.EndInvoke(result));    //异步委托要调用EndInvoke有两个目的:1)获取近回值 2)防止内存泄漏
        }
Пример #3
0
    private void Start()
    {
        SampleDelegate counter = CountCharacters;
        SampleDelegate parser  = Parse;

        var counterResult = counter.BeginInvoke("hello", null, null);
        var parserResult  = parser.BeginInvoke("10", null, null);

        print("Основной поток с ID = " + Thread.CurrentThread.ManagedThreadId + " продолжает выполняться");

        print("Счетчик вернул " + counter.EndInvoke(counterResult));
        print("Парсер вернул " + parser.EndInvoke(parserResult));

        print("Основной поток с ID = " + Thread.CurrentThread.ManagedThreadId + " завершился");
    }
Пример #4
0
        static void Main(string[] args)
        {
            SampleDelegate counter = new SampleDelegate(CountCharacters);
            SampleDelegate parser  = new SampleDelegate(Parser);

            IAsyncResult couterResult = counter.BeginInvoke("hello", null, null);          //这里不会堵塞
            IAsyncResult parserResult = parser.BeginInvoke("10", null, null);              //这里不会堵塞

            Console.WriteLine("Main thread continuing");

            Console.WriteLine("Counter returned {0}", counter.EndInvoke(couterResult));  //会在这里堵塞
            Console.WriteLine("Parser returned {0}", parser.EndInvoke(parserResult));    //会在这里堵塞

            Console.WriteLine("Done");
            Console.ReadKey();
        }
Пример #5
0
        static void Main(string[] args)
        {
            // class instance
            Program p = new Program();

            // -- delegates
            //FirstDelegate del = new FirstDelegate(p.Hello);
            //FirstDelegate del2 = new FirstDelegate(p.Hello);
            //FirstDelegate del3 = new FirstDelegate(p.Hello);

            //FirstDelegate del_comb = del + del2 + del3;
            //Console.WriteLine(del_comb(23));

            //Console.WriteLine(del(10));
            //Console.WriteLine(del(12));
            //Console.WriteLine(del(23));
            //Console.WriteLine(del.Method.Name);
            //Console.WriteLine(del.Target.ToString());

            // -- events
            //ClassWithEvents cwe = new ClassWithEvents();
            //cwe.FirstEvent += firstEventHandler;
            //cwe.CallEvent(34);

            //cwe.SomeThreadSafeEvent += SomeThreadSafeEventHandler;
            //cwe.CallEvent_TS(989);

            //Console.WriteLine(new string('-', 80));
            //cwe.SomeThreadSafeEvent -= SomeThreadSafeEventHandler;
            //cwe.CallEvent_TS(989);

            // -- async delegates
            SampleDelegate counter = new SampleDelegate(CountCharacters);
            SampleDelegate parser  = new SampleDelegate(Parse);
            // EndInvoke blocks main thread and wait for result
            //IAsyncResult counterResult = counter.BeginInvoke("hello", null, null);
            //IAsyncResult parserResult = parser.BeginInvoke("20", null, null);
            //Console.WriteLine("Main thread continued.");

            //Console.WriteLine("Counter returned : {0}",counter.EndInvoke(counterResult));
            //Console.WriteLine("Parser returned : {0}",parser.EndInvoke(parserResult));

            // EndInvoke not blocks main thread
            AsyncCallback callBack = new AsyncCallback((result) =>
            {
                string format = result.AsyncState as string;
                AsyncResult delefateResult      = result as AsyncResult;
                SampleDelegate delegateInstance = delefateResult.AsyncDelegate as SampleDelegate;

                if (delegateInstance != null)
                {
                    Console.WriteLine(format, delegateInstance.EndInvoke(result));
                }
            });

            counter.BeginInvoke("hello", callBack, "Counter returned {0}");
            parser.BeginInvoke("10", callBack, "Parser returned {0}");

            Console.WriteLine("Main thread continued.");

            Console.WriteLine("Done.");

            Console.ReadLine();
        }