• 今日学习:关于C#多线程之一——异步委托


    一、什么时候使用多线程

          对于需要等待的操作如:文件操作、从网络加载信息等,此时可以使用一个线程进行这些操作,新开一个线程运行其他的操作,提高效率增加用户体验。典型的例子是word程序中的拼写检查器:一个线程等待用户输入,另一个线程进行后台搜索、第三个线程将写入的数据存储在临时文件中、第四个线程进行从internet上下载相关信息。

    二、c#使用线程的最简单方法——异步委托

    C#使用线程的方法很多其中使用委托(Delegate)的BeginEnvoke()方法和EndInvoke()是一个简单的方法。

    使用BeginInvoke方法步骤:

    1.创建一个要执行的函数如以下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    namespace MyThread
    {
       
    class Program
        {

            //创建函数
           
    private static int newTask(int ms)
            {
                Console.WriteLine(
    "任务开始");
                Thread.Sleep(ms);
                Random random
    = new Random();
               
    int n = random.Next(10000);
                Console.WriteLine(
    "任务完成");
               
    return n;
            }

           
    static void Main(string[] args)
            {

            }
        }
    }

    创建了一个返回类型为int的newTask函数,该函数接收一个int型的参数,指定线程的阻塞时间。

    2.创建一个可以指向该方法的委托,即委托的参数类型和返回类型与该函数一致,如下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    namespace MyThread
    {
       
    class Program
        {

            //创建函数
           
    private static int newTask(int ms)
            {
                Console.WriteLine(
    "任务开始");
                Thread.Sleep(ms);
                Random random
    = new Random();
               
    int n = random.Next(10000);
                Console.WriteLine(
    "任务完成");
               
    return n;
            }

            //创建委托
           
    private delegate int NewTaskDelegate(int ms);
           
    static void Main(string[] args)
            {

            }
        }
    }

    3.实例化新创建的委托,并使用该实例的BeginInvoke方法和EndInvoke方法进行函数的异步调用。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    namespace MyThread
    {
       
    class Program
        {

           
    //创建函数
            private static int newTask(int ms)
            {
                Console.WriteLine(
    "任务开始");
                Thread.Sleep(ms);
                Random random
    = new Random();
               
    int n = random.Next(10000);
                Console.WriteLine(
    "任务完成");
               
    return n;
            }

           
    //创建委托
            private delegate int NewTaskDelegate(int ms);
           
    static void Main(string[] args)
            {

               
    //实例化委托
                NewTaskDelegate task = newTask;

               
    //使用BeginInvoke方法异步调用newTask方法,并传入2000作为newTask的参数
                IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);
               
    // EndInvoke方法将被阻塞2秒

               
    // EndInvoke方法接收一个IAsyncResult的参数,将返回newTask方法的返回值

               
    int result = task.EndInvoke(asyncResult);
                Console.WriteLine(result);
            }
        }
    }

    关于BeginInvoke的参数和返回值:

    它与您需要异步执行的方法具有相同的参数,另外它还有两个可选参数。第一个参数是一个 AsyncCallback 委托,该委托引用在异步调用完成时要调用的方法。第二个参数是一个用户定义的对象,该对象可向回调方法传递信息。BeginInvoke 立即返回,不等待异步调用完成。BeginInvoke 会返回 IAsyncResult,这个结果可用于监视异步调用进度。

    关于EndInvoke的返回值:EndInvoke方法的返回值就是被调用方法的返回值。如果异步调用的方法(这里指newTask方法)尚未完成,EndInvoke 将一直阻止调用线程,直到异步调用异步调用的方法(这里指newTask方法)完成后,才允许调用线程执行。

  • 相关阅读:
    Android JNI之C/C++层调用JAVA
    Android NDK编译之undefined reference to 'JNI_CreateJavaVM'
    Android 开创java世界(JNI Invocation API)
    Android JNI c/c++调用java 无需新建虚拟机
    cmake:善用find_package()提高效率暨查找JNI支持
    如何解决用CMake未定义引用`JNI_CreateJavaVM'?
    [Linker error] undefined reference to `_imp__JNI_CreateJavaVM@12'
    Android jni c/c++线程通过CallVoidMethod调用java函数出现奔溃问题
    【故障公告】部署在 k8s 上的博客后台昨天与今天在访问高峰多次出现 502团队
    上周热点回顾(3.30-4.5)团队
  • 原文地址:https://www.cnblogs.com/yuanyuan/p/1709446.html
Copyright © 2020-2023  润新知