• 用异步的方式调用同步方法



    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    using System.Collections;
    using System.Threading;
    using System.IO;
    using System.Runtime.InteropServices;
    using System;
    using System.Runtime.Remoting.Messaging;

    namespace Test
    {
        
    class Program
        {

            
    delegate void mydelegate();

            
    private void smork()
            {
                
    //方法1
                AsyncCallback mycallback = new AsyncCallback(tellyou);//(回调函数)
                mydelegate mdg = new mydelegate(move);
                IAsyncResult result 
    = mdg.BeginInvoke(mycallback, null);
                result.AsyncWaitHandle.WaitOne();
    //等待异步完成
                Console.WriteLine("异步调用后");

                
    //方法2
                
    //AsyncCallback mycallback = new AsyncCallback(tellyou);
                
    //mydelegate mdg = new mydelegate(move);
                
    //IAsyncResult result = mdg.BeginInvoke(mycallback, null);
                
    //while (!result.IsCompleted)
                
    //{
                
    //    //Thread.Sleep(50);//不要与要有区别
                
    //}


                
    // 方法3(没有回调函数)
                
    // mydelegate mdg = new mydelegate(move);
                
    // IAsyncResult result = mdg.BeginInvoke(null, null);
                
    // while (!result.IsCompleted)
                
    // {
                
    //     //Thread.Sleep(60);
                
    // }
                
    // mdg.EndInvoke(result); //停止调用


                
    //方法4(没有回调函数)
                
    //mydelegate mdg = new mydelegate(move);
                
    //IAsyncResult result = mdg.BeginInvoke(null, null);
                
    //result.AsyncWaitHandle.WaitOne();
                
    //mdg.EndInvoke(result); //停止调用 


            }
            
            
    public void move()
            {
                
    for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine(
    "异步任务执行");
                    Thread.Sleep(
    1000);
                }
            }
            
            
    public void tellyou(IAsyncResult result)//回调函数
            {
                AsyncResult asyncResult 
    = result as AsyncResult;

                mydelegate mydelegate 
    = asyncResult.AsyncDelegate as mydelegate;
                mydelegate.EndInvoke(result);

                
    if (result.IsCompleted)
                {
                    Console.WriteLine(
    "异步任务完成");
                }
            }

            
    static void Main(string[] args)
            {
                Program pr 
    = new Program();
                Console.WriteLine(
    "开始执行..");
                pr.smork();
                Thread.Sleep(
    1000);//注释掉结果有点不同
                Console.WriteLine("我是主线程");
                Console.ReadLine();
            }
        }
    }
  • 相关阅读:
    MongoDB初期学习
    springboot+camunda实现工作流1
    一文带你深入理解位运算
    【林超所长】学科01:熵与热力学重要模型
    PM常用的讨论社区及牛人帖子
    C# 2.0 的特性 总结
    小脚本解决生活问题
    Domain Adaption 之 TCA等算法
    强化学习ddpg算法
    bindkey用法
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1535731.html
Copyright © 2020-2023  润新知