zoukankan      html  css  js  c++  java
  • C#基础线程学习之异步委托线程补充

    异步委托线程补充

    1:  bool  IAsyncResult.AsyncWaitHandle.waitone(1000)的使用

           等待异步委托函数1000ms,在1000ms内接收到委托函数执行完的信息后,立即返回true,1000ms内未执行完返回false

          

    class Program
        {
            static void Main(string[] args)
            {
                Thread thread = Thread.CurrentThread;//获取当前线程对象
                Console.WriteLine(thread.ManagedThreadId);//打印出当前对象的id
                Func<int, int> a = test;//委托
                IAsyncResult thread1 = a.BeginInvoke(1, null, null);//启动异步委托线程
                bool istrue = thread1.AsyncWaitHandle.WaitOne(1000);//检测1000ms内异步委托线程是否结束
                if (istrue)//结束打印aaa
    { Console.WriteLine(
    "aaa"); } int value = a.EndInvoke(thread1);//获取异步委托线程的返回值 Console.WriteLine(value); Console.ReadKey(); } private static int test(int arg)//委托方法 { Thread thread = Thread.CurrentThread; Console.WriteLine(thread.ManagedThreadId); Thread.Sleep(1000);//本线程暂停1000ms return arg; }

    2:异步委托的回调函数的参数问题

    IAsyncResult al=委托.BeginInvoke(null,null)//nul前面是传委托的参数的,第一个null是指异步委托的回调函数,第二个null是回调函数的参数,这个null只能是引用类型在回调函数中用IAsyncResult.AsyncState获取这个参数,再转化为自生类型使用

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 异步委托实现线程
    {
        class Program
        {
            static void Main(string[] args)
            {
                Func<int, int> a = test;//将test方法委托给a
                IAsyncResult thread1 = a.BeginInvoke(20, onCallBack, "string");//"string"作为回调函数的参数传入回调函数,onCallBack是回调函数      
                Console.ReadKey();
            }
    
            private static int test(int arg)
            {
                Thread thread = Thread.CurrentThread;
                Console.WriteLine(thread.ManagedThreadId);
                Thread.Sleep(1000);//暂停本线程1000ms
                return arg;
            }
            /// <summary>
            /// 异步委托的回调函数
            /// </summary>
            /// <param name="ar"></param>
            public static void onCallBack(IAsyncResult ar)//回调函数的参数是IAsyncResult ,将委托线程的状态传给回调函数
            {
                string  value = ar.AsyncState as string;//IAsyncResult.AsyncState是获取异步委托线程的第四个参数,将其转化为自生的类型
                Console.WriteLine(value);
            }
        }
    }

    3:异步委托的回调函数获取委托返回值的第二种方法:利用异步委托线程的第四个参数,直接把委托传入回调函数,再回调函数中用委托调用EndInvoke(IAsyncResult)获取委托函数的返回值

    一般我们不再线程中获取另一个线程的返回值,因为如果另一个线程阻塞,则这个线程也会阻塞

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 异步委托实现线程
    {
        class Program
        {
            static void Main(string[] args)
            {
                Func<int, int> a = test;//将test方法委托给a
                IAsyncResult thread1 = a.BeginInvoke(20, onCallBack, a);//"string"作为回调函数的参数传入回调函数,onCallBack是回调函数      
                Console.ReadKey();
            }
    
            private static int test(int arg)
            {
                Thread thread = Thread.CurrentThread;
                Console.WriteLine(thread.ManagedThreadId);
                Thread.Sleep(1000);//暂停本线程1000ms
                return arg;
            }
            /// <summary>
            /// 异步委托的回调函数
            /// </summary>
            /// <param name="ar"></param>
            public static void onCallBack(IAsyncResult ar)//回调函数的参数是IAsyncResult ,将委托线程的状态传给回调函数
            {
                Func<int, int> fun = ar.AsyncState as Func<int,int>;//IAsyncResult.AsyncState是获取异步委托线程的第四个参数,将其转化为自生的类型,这里传入的是委托函数,我们将它转化为原来的类型
                int value = fun.EndInvoke(ar);//等待获取委托函数的返回值
                Console.WriteLine(value);
            }
        }
    }
  • 相关阅读:
    〖Linux〗Kubuntu设置打开应用时就只在打开时的工作区显示
    〖Linux〗Kubuntu, the application 'Google Chrome' has requested to open the wallet 'kdewallet'解决方法
    unity, dll is not allowed to be included or could not be found
    android check box 自定义图片
    unity, ios skin crash
    unity, Collider2D.bounds的一个坑
    unity, ContentSizeFitter立即生效
    类里的通用成员函数应声明为static
    unity, Gizmos.DrawMesh一个坑
    直线切割凹多边形
  • 原文地址:https://www.cnblogs.com/zhangyang4674/p/11413306.html
Copyright © 2011-2022 走看看