精华内容
参与话题
问答
  • C# 回调方法

    千次阅读 2018-08-04 09:26:09
     定义某种类型的事件---------在方法中传递该事件类型的参数并调用------将这个类中的数据传递给事件方法并调用 using UnityEngine; using System.Collections; public class CallBackTest : MonoBehaviour {   ...

    1.定义事件的类------

       定义某种类型的事件---------在方法中传递该事件类型的参数并调用------将这个类中的数据传递给事件方法并调用

    using UnityEngine;
    using System.Collections;

    public class CallBackTest : MonoBehaviour {
        
        public System.Action NoParamersCallBack;
        public System.Action <int>  ValueCallBack;
        public delegate bool CallBackDelegate ( Info f); 
        public event  CallBackDelegate calld;

        public static CallBackTest _instancs;
        public int i;
        public string ss;
        public Info f;
        void Awake(){
            _instancs = this;
            i = Random.Range (2, 8);
            f = new Info ("sb", true);
        }
        // Use this for initialization
        void Start () {
            
            NoParamersCallBack += callme;
            NoParamersCallBack();
        }
        
        // Update is called once per frame
        void Update () {
        
        }


        public void callme() {

            Debug.Log ("内部注册了事件");
        }

        // 值类型参数
        public void GET( System.Action<int> call,string s= "")
        {  
            
            ss= s ;
            Debug.Log (ss);
            call(i);

        }

        //引用
        public void  GETMore( CallBackDelegate calld){
            
            calld(f);
        }


        public  class Info{
            
            public  string  name;
            public  bool isMen ;
            public Info( string name, bool ismen){
                this.name = name;
                isMen =  ismen ;
            }
        }
    }
     

    2.传递调用的类

        调用方法----传递回调函数-----得到定义事件类的信息

    using UnityEngine;
    using System.Collections;

    public class Call : MonoBehaviour {
        public int C ;
        void Awake(){
            CallBackTest._instancs.NoParamersCallBack += T;
        }
        // Use this for initialization
        void Start () {
            
            CallBackTest._instancs.GET (T1, "shabi");
            CallBackTest._instancs.GETMore(T2);
        }

        // Update is called once per frame
        void Update () {
        
        }
        
        public void T(){
            Debug.Log ("外部注册的事件");
        }

        public void T1(int A ){
                    C = A * A;
                    Debug.Log (C);

        }


        public  bool  T2(CallBackTest.Info i){
            
            i.name = "caibi";
            i.isMen = false;

            Debug.Log(string.Format("名字:{0}",CallBackTest._instancs.f.name));
            Debug.Log(string.Format("性别:{0}",CallBackTest._instancs.f.isMen));
            return  i.isMen;
        }
    }
     

    展开全文
  • 异步编程C#回调方法

    2017-06-19 02:36:00
    应用程序调用方法异步执行某个操作时,应用程序可在异步方法执行其任务时继续执行。 2、同步与异步的区别 同步(Synchronous):在执行某个操作时,应用程序必须等待该操作执行完成后才能继续执行。 异步...

    1、什么是异步?

    异步操作通常用于执行完成时间可能较长的任务,如打开大文件、连接远程计算机或查询数据库。异步操作在主应用程序线程以外的线程中执行。应用程序调用方法异步执行某个操作时,应用程序可在异步方法执行其任务时继续执行。

    2、同步与异步的区别

    同步(Synchronous):在执行某个操作时,应用程序必须等待该操作执行完成后才能继续执行。

    异步(Asynchronous):在执行某个操作时,应用程序可在异步操作执行时继续执行。实质:异步操作,启动了新的线程,主线程与方法线程并行执行。

    3、异步和多线程的区别

          我们已经知道,异步的实质是开启了新的线程。它与多线程的区别是什么呢?

          简单的说就是:异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池。

          就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理。异步操作执行时,会将操作丢给线程池中的某个工作线程来完成。当开始I/O操作的时候,异步会将工作线程还给线程池,这意味着获取网页的工作不会再占用任何CPU资源了。直到异步完成,即获取网页完毕,异步才会通过回调的方式通知线程池。可见,异步模式借助于线程池,极大地节约了CPU的资源。

          注:DMA(Direct Memory Access)直接内存存取,顾名思义DMA功能就是让设备可以绕过处理器,直接由内存来读取资料。通过直接内存访问的数据交换几乎可以不损耗CPU的资源。在硬件中,硬盘、网卡、声卡、显卡等都有直接内存访问功能。异步编程模型就是让我们充分利用硬件的直接内存访问功能来释放CPU的压力。
    两者的应用场景:

          计算密集型工作,采用多线程。
          IO密集型工作,采用异步机制。

    4、异步应用

    .NET Framework 的许多方面都支持异步编程功能,这些方面包括:
          1)文件 IO、流 IO、套接字 IO。
          2)网络。
          3)远程处理信道(HTTP、TCP)和代理。
          4)使用 ASP.NET 创建的 XML Web services。
          5)ASP.NET Web 窗体。
          6)使用 MessageQueue 类的消息队列。

    .NET Framework 为异步操作提供两种设计模式:
          1)使用 IAsyncResult 对象的异步操作。
          2)使用事件的异步操作。
          IAsyncResult 设计模式允许多种编程模型,但更加复杂不易学习,可提供大多数应用程序都不要求的灵活性。可能的话,类库设计者应使用事件驱动模型实现异步方法。在某些情况下,库设计者还应实现基于 IAsyncResult 的模型。 

          使用 IAsyncResult 设计模式的异步操作是通过名为 Begin操作名称和End操作名称的两个方法来实现的,这两个方法分别开始和结束异步操作操作名称。例如,FileStream 类提供 BeginRead 和 EndRead 方法来从文件异步读取字节。这两个方法实现了 Read 方法的异步版本。在调用 Begin操作名称后,应用程序可以继续在调用线程上执行指令,同时异步操作在另一个线程上执行。每次调用 Begin操作名称 时,应用程序还应调用 End操作名称来获取操作的结果。Begin操作名称 方法开始异步操作操作名称并返回一个实现 IAsyncResult 接口的对象。 .NET Framework 允许您异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的 BeginInvoke 和 EndInvoke 方法。   

    IAsyncResult 对象存储有关异步操作的信息。下表提供了有关异步操作的信息。

    名称       

    说明

    AsyncState

    获取用户定义的对象,它限定或包含关于异步操作的信息。

    AsyncWaitHandle

    获取用于等待异步操作完成的 WaitHandle。

    CompletedSynchronously

    获取一个值,该值指示异步操作是否同步完成。

    IsCompleted

    获取一个值,该值指示异步操作是否已完

    5、应用实例

    案例1-读取文件

    通常读取文件是一个比较耗时的工作,特别是读取大文件的时候,常见的上传和下载。但是我们又不想让用户一直等待,用户同样可以进行其他操作,可以使得系统有良好的交互性。这里我们写了同步调用和异步调用来进行比较说明。

    using System;
    using System.IO;
    using System.Threading;
    
    namespace AsynSample
    {
        class FileReader
        {
            /// <summary>
            /// 缓存池
            /// </summary>
            private byte[] Buffer { get; set; }
            /// <summary>
            /// 缓存区大小
            /// </summary>
            public int BufferSize { get; set; }
    
            public FileReader(int bufferSize)
            {
                this.BufferSize = bufferSize;
                this.Buffer = new byte[BufferSize];
            }
    
            /// <summary>
            /// 同步读取文件
            /// </summary>
            /// <param name="path">文件路径</param>
            public void SynsReadFile(string path)
            {
                Console.WriteLine("同步读取文件 begin");
                using (FileStream fs = new FileStream(path, FileMode.Open))
                {                
                    fs.Read(Buffer, 0, BufferSize);
                    string output = System.Text.Encoding.UTF8.GetString(Buffer);
                    Console.WriteLine("读取的文件信息:{0}",output);
                }
               
                Console.WriteLine("同步读取文件 end");
            }
            /// <summary>
            /// 异步读取文件
            /// </summary>
            /// <param name="path"></param>
            public void AsynReadFile(string path)
            {
                Console.WriteLine("异步读取文件 begin");
                //执行Endread时报错,fs已经释放,注意在异步中不能使用释放需要的资源
                //using (FileStream fs = new FileStream(path, FileMode.Open))
                //{
                //    Buffer = new byte[BufferSize];
                //    fs.BeginRead(Buffer, 0, BufferSize, AsyncReadCallback, fs);
                //} 
                if (File.Exists(path))
                {
                    FileStream fs = new FileStream(path, FileMode.Open);
                    fs.BeginRead(Buffer, 0, BufferSize, AsyncReadCallback, fs);
                }
                else
                {
                    Console.WriteLine("该文件不存在");
                }
    
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="ar"></param>
            void AsyncReadCallback(IAsyncResult ar)
            {
                FileStream stream = ar.AsyncState as FileStream;
                if (stream != null)
                {
                    Thread.Sleep(1000);
                    //读取结束
                    stream.EndRead(ar);
                    stream.Close();
    
                    string output = System.Text.Encoding.UTF8.GetString(this.Buffer);
                    Console.WriteLine("读取的文件信息:{0}", output);
                }
            }
        }
    }

    测试用例

    using System;
    using System.Threading;
    
    namespace AsynSample
    {
        class Program
        {
            static void Main(string[] args)
            {
                FileReader reader = new FileReader(1024);
    
                //改为自己的文件路径
                string path = "C:\\Windows\\DAI.log";
    
                Console.WriteLine("开始读取文件了...");
                //reader.SynsReadFile(path);
    
                reader.AsynReadFile(path);
    
                Console.WriteLine("我这里还有一大滩事呢.");
                DoSomething();
                Console.WriteLine("终于完事了,输入任意键,歇着!");
                Console.ReadKey();           
            }
            /// <summary>
            /// 
            /// </summary>
            static void DoSomething()
            {
                Thread.Sleep(1000);
                for (int i = 0; i < 10000; i++)
                {
                    if (i % 888 == 0)
                    {
                        Console.WriteLine("888的倍数:{0}",i);
                    }
                }
            }
        }
    }

    转载于:https://www.cnblogs.com/dearbeans/p/7046824.html

    展开全文
  • C#回调方法

    2014-09-09 19:19:00
    C# 里面回调方法一般指某个委托.也可以说是接口. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { //C.....

    C# 里面回调方法一般指某个委托.也可以说是接口.

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        class Program
        {


            //C#五大数据对象:对象,类,接口,代理,数组
            //Object,Class,interface,delegate,数组

     

     

            //定义委托 //委托为C#五大数据对象之一 ,与Class平起平坐
            public delegate void WorkDome(); 

            //将方法用作参数传递,定义一种通用的格式类型(委托)做方法的参数类型
            public static void working(WorkDome CallBack)
            {
                CallBack();
            }

     

            //Doing
            public static void WorkDoneHandler()
            {
                //Do something other.
                Console.WriteLine("Do something other.....");
            }

     

            static void Main(string[] args)
            {
                WorkDome callBack = new WorkDome(WorkDoneHandler);
                callBack();

                //接收 WorkDome类型(委托)
                working(callBack);
            }

     

            //也就是相当把某个方法WorkDoneHandler当作参数,
            //传递给另外一个方法Working(WorkDone callBack).

     

            //这样做的好处在于,可以动态的指定执行哪个方法.

     

            //比如在Main()方法中,我们指定的callback 是WorkDoneHandler ,
            //当然也可以是其它匹配的方法. 而Working()方法 更本不需要知道自己最后执行的是哪个方法(Handler).


        }
    }



     

     

    转载于:https://www.cnblogs.com/xulang/p/5506185.html

    展开全文
  • c#异步回调方法

    2013-07-04 15:59:47
    C#中使用线程的方法很多,使用委托的BeginInvoke和EndInvoke方法就是其中之一。BeginInvoke方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被...

    在C#中使用线程的方法很多,使用委托的BeginInvoke和EndInvoke方法就是其中之一。BeginInvoke方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace TestAsyn
    {

    /// <summary>
    /// 保存流数据结果通知回调,通知数据保存是否成功
    /// </summary>
    public delegate int SaveStreamData(bool bSaveSuccess);


    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private int DoSaveStreamData(bool bSaveSuccess)
    {
    return 100;
    }

    private void button1_Click(object sender, EventArgs e)
    {
    SaveStreamData ssd = new SaveStreamData(DoSaveStreamData);
    ssd.BeginInvoke(true, new AsyncCallback(SaveResultCallBack), ssd);
    }

    private void SaveResultCallBack(IAsyncResult ar)
    {
    this.button1.Text = (ar.AsyncState as SaveStreamData).EndInvoke(ar).ToString();
    }

    }
    }

    这里使用了BeginInvoke方法的最后两个参数(如果被调用的方法含有参数的话,这些参数将作为BeginInvoke的前面一部分参数,如果没有参数,BeginInvoke就只有两个参数了)。第一个参数是回调方法委托类型,这个委托只有一个参数,就是IAsyncResult,如SaveResultCallBack方法所示。当DoSaveStreamData方法执行完后,系统会自动调用SaveResultCallBack方法。BeginInvoke的第二个参数需要向SaveResultCallBack方法中传递一些值,一般可以传递被调用方法的委托,如上面代码中的ssd。这个值可以使用IAsyncResult.AsyncState属性获得。
    由于上面的代码通过异步的方式访问的form上的一个this.button1.Text,因此,需要按ctrl+f5运行程序(不能直接按F5运行程序,否则无法在其他线程中访问这个this.button1.Text)。

    展开全文
  • C#方法回调

    2019-03-08 23:03:00
    通过接口 class Program { static void Main1(string[] args) { var controller = new Controller(new CallBack()); controller.Execute(); } } publ...
  • C++回调C#方法

    2012-07-07 00:33:49
    在VC中封装的网络通信模块,在异步接收到数据时需要将... C++的回调函数中有一个参数,是处理接收到的字节流的回调函数指针,定义基本如下: typedef void (*fpDataReceived)(char *data ,int len); 其中char ...
  • public delegate void testdelegate(string handler); private void test(testdelegate aaa) { aaa("aaa"); } protected void Page_Load(object sender, EventArgs e)
  • C#: using System; using System.Collections.Generic; using System.Text; namespace Delegate { //定义委托,它定义了可以代表的方法的类型 public delegate void welcomeDelegate(string name); ...
  • C#通过线程实现回调方法

    千次阅读 2013-10-12 16:22:09
    当启动一个线程去执行某件事情,但是我不知道此线程什么时候执行完,这时候就可以通过委托来实现回调,当线程执行完成后调用回调函数,来通知注册者。 方法: public delegate void WeatherSearchCallBack();...
  • 在VC中封装的网络通信模块,在异步接收到数据时需要将内容传递给C#中的消息处理函数,于是便出现了如... C++的回调函数中有一个参数,是处理接收到的字节流的回调函数指针,定义基本如下:   typedef void 
  • C#回调函数

    万次阅读 2011-11-21 14:42:11
    C#回调函数应用示例,形象比喻方法助理解,整理了一个简单的例子来说明回调函数的用法: namespace CallBackFunction {  class Program  {  static void Main(string[] args)  {  Program prog = ...
  • C# 回调函数

    2015-02-11 11:16:05
    C# 回调函数using UnityEngine; using System.Collections;// 回调函数就是把一个方法作为另一个方法的参数,去执行。如将 A 方法作为 B 方法的参数,在 B 方法中调用 A 方法//举个例子说明:妈妈在做饭,没有酱油了...
  • C#回调函数应用示例,形象比喻方法助理解,整理了一个简单的例子来说明回调函数的用法: namespace CallBackFunction {  class Program  {  static void Main(string[] args)  {  Program prog = ...
  • c#调用c++带有回调函数方法的实现

    万次阅读 2012-11-06 16:41:49
    在c++中有个回调函数指针的概念,只需要某个函数在调用定时器函数时传入一个函数指针就能达到目的,但C#中没有函数指针的概念,我们该怎样来实现呢。...首先用c++写一个带有回调函数的方法 Test,在此省略。
  • 然而,如果我们想在进行异步调用的时候进行很好的管理得话,那使用完成回调方法将是一个不错的选择。  一:回调方法的签名和工作机制  1.回调方法必须要符合以下签名:  &lt;修饰符&gt;void &.....
  • 今天在做AVG工具的选择分支功能时发现了一个问题,先把代码贴上来: 1 private void SelectionParse(string value) 2 { 3 string[] ss = value.Split('|'); 4 List<... s_inss = new List<...
  • C#回调方法不通过object参数获得委托实例 回调方法中几乎都会存在获取委托实例的需求,进而通过委托实例调用EndInvoke以得到异步执行的返回值。在我看过的相关文章中,获取委托实例的方法几乎都是...
  • C#回调函数应用示例,形象比喻方法助理解,整理了一个简单的例子来说明回调函数的用法: namespace CallBackFunction { class Program { static void Main(string[] args) { Program prog = new Progr...
  • C#回调机制解析

    千次阅读 2011-09-01 18:05:16
    C#回调机制实例解析  周四设计模式的课上,老师说到了回调机制的问题。本文实例解析了C#中回调机制的应用方法。 1.什么是回调 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、...
  • 关于C#中的回调方法的定义以及使用

    千次阅读 2019-07-20 12:35:19
    关于C#中的回调方法的定义以及使用 微软对于C#开发人员可以说是尽心尽力,这和微软的理念有关,微软认为,软件开发人员应该注重业务逻辑的分析,将开发的重心放在如何使软件更加人性化,业务逻辑更加通畅 lambda...
  • c\c++\c#回调lua方法

    2017-06-23 17:34:03
    mark…

空空如也

1 2 3 4 5 ... 20
收藏数 1,488
精华内容 595
关键字:

c# 回调方法

c# 订阅