zoukankan      html  css  js  c++  java
  • 今日学习:关于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方法)完成后,才允许调用线程执行。

  • 相关阅读:
    CSUFT 1002 Robot Navigation
    CSUFT 1003 All Your Base
    Uva 1599 最佳路径
    Uva 10129 单词
    欧拉回路
    Uva 10305 给任务排序
    uva 816 Abbott的复仇
    Uva 1103 古代象形文字
    Uva 10118 免费糖果
    Uva 725 除法
  • 原文地址:https://www.cnblogs.com/yuanyuan/p/1709446.html
Copyright © 2011-2022 走看看