• 创建线程之异步委托


    首先定义一个runtaketime委托:

    public delegate int runtaketime(int data,int ms);

    定义一个静态的方法,参数,返回类型和定义的委托一样
    static public int taketime(int data, int ms)
    {
    Console.WriteLine("time begin!");
    Thread.Sleep(ms);
    Console.WriteLine("time end!");
    return data++;
    }

    1.投票,检查委托是否完成了它的任务

    main()函数代码:
    runtaketime a = new runtaketime(taketime);//把taketime方法加载到委托中
    IAsyncResult ar = a.BeginInvoke(2, 3000, null, null);//异步调用该委托中的方法,返回IAsyncResult

    //while循环和委托中的方法一块执行,但是end方法后面的代码必须等到委托中方法执行完毕才可以执行
    while (!ar.IsCompleted)//判断委托是否完成了任务
    {
    Thread.Sleep(50);
    Console.Write(".");
    }
    int result = a.EndInvoke(ar);//endinvoke()方法的返回值与其同步副本(委托中的方法)的返回值相同,参数为IAsyncResult

    Console.WriteLine("result:{0}",result);

    2.等待句柄,另一种等待异步委托执行的方式是使用与IasyncResult相关联的句柄

    main()函数代码:

    runtaketime a = new runtaketime(taketime);//把taketime方法加载到委托中
    IAsyncResult ar = a.BeginInvoke(2, 3000, null, null);//异步调用该委托中的方法,返回IAsyncResult

    //IasyncWaitHandle属性可以访问等待句柄,他返回一个WaitHandle对象,可以等待委托线程完成其任务
    //WaitOne()方法中的参数为要等待的最长时间,如果超时则返回false,循环继续执行
    while (!ar.AsyncWaitHandle.WaitOne(50))
    {
     Console.Write(".");
     Thread.Sleep(50);
    }

    int result = a.EndInvoke(ar);//endinvoke方法的返回值与其同步副本(委托中的方法)的返回值相同,参数为IAsyncResult
    Console.WriteLine("result:{0}",result);

    3.异步回调是等待委托的结果的第三种方式

    main()函数代码:

    runtaketime a = new runtaketime(taketime);//把taketime方法加载到委托中
    IAsyncResult ar = a.BeginInvoke(2, 3000, runtimecallback, a);//只要runtaketime委托完成任务,就会调用runtimecallback方法,参数a向异步操作完成时调用的方法传递特定的状态信息,即参数IAsyncResult ar
    //在委托线程没有完成之前,不能结束主线程
    for (int i = 0; i < 100; i++)
    {
    Thread.Sleep(50);
    Console.Write(".");
    }

    runtimecallback()方法:

    static void runtimecallback(IAsyncResult ar)
    {
    runtaketime a = ar.AsyncState as runtaketime;//把ar.AsyncState转换为runtaketime类型
    Trace.Assert(a != null, "someting wrong!");//检查条件;如果条件为 false,则输出指定消息,并显示一个消息框,其中会显示调用堆栈。
    int result = a.EndInvoke(ar);
    Console.WriteLine("result:{0}", result);
    }

  • 相关阅读:
    线程的补充
    线程
    进程
    操作系统和进程
    socketserver模块实现并发和连接合法性验证
    socketserver实例化过程
    粘包现象和解决方法
    网络通信协议
    初探网络
    Python网络编程
  • 原文地址:https://www.cnblogs.com/runninglzw/p/3842480.html
Copyright © 2020-2023  润新知