.NET : Func委托和Action委托

上一篇我们讲到了如何在ASP.NET页面中实现异步任务。我们来回顾一下里面一个特殊的类型:LongTimeTask

public class LongTimeTask
{
    public string Result = string.Empty;
    public HelloWorldHandler handler;

public delegate string HelloWorldHandler();
    public string HelloWorld()
    {
        Thread.Sleep(5000);
        return "Hello,world";
    }

public IAsyncResult OnBegin(object sender, EventArgs e,
AsyncCallback cb, object extraData)
    {
        handler = new HelloWorldHandler(this.HelloWorld);
        return handler.BeginInvoke(cb, extraData);

}

public void OnEnd(IAsyncResult ar)
    {
        Result = handler.EndInvoke(ar);
    }

public void OnTimeout(IAsyncResult ar)
    {
        Result = "超时了";
    }
}

我们真正要执行是HelloWorld,但是,为了能够异步调用该方法,所以我们定义了一个delegate(委托),上面红色标出的代码就可以看到,这个delegate其实是我们全部代码中的灵魂。

我这一篇讨论的是:以前我们为了能够调用一个方法,必须比照这个方法定义一个相应的delegate,这个是否能有更好的实现办法呢?

答案是:有,也就是有通用的delegate了。在.NET Framework 3.5中,提供了两类通用的delegate。

  1. 如果方法有返回值,则使用Func,或者Func<>
  2. 如果方法没有返回值,则使用Action,或者Action<>

关于这两个委托的详细资料,大家可以参考MSDN的文档

要使用这两个delegate,必须引用System.Core.dll

下面来看修改好的代码

using System;
using System.Threading;

namespace WebApplication2
{
    public class LongTimeTask
    {
        public string Result = string.Empty;
        public Func<string> handler;

public delegate string HelloWorldHandler();
        public string HelloWorld()
        {
            Thread.Sleep(5000);
            return "Hello,world";
        }

public IAsyncResult OnBegin(object sender, EventArgs e,
    AsyncCallback cb, object extraData)
        {
           handler = new Func<string>(this.HelloWorld);
            return handler.BeginInvoke(cb, extraData);

}

public void OnEnd(IAsyncResult ar)
        {
            Result = handler.EndInvoke(ar);
        }

public void OnTimeout(IAsyncResult ar)
        {
            Result = "超时了";
        }
    }
}

.NET : Func委托和Action委托

时间: 2024-08-14 00:57:15

.NET : Func委托和Action委托的相关文章

C#中常见的委托(Func委托、Action委托、Predicate委托)

今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型: (1) *delegate TResult Func<TResult>(); (2)*delegate TResult Func<T1,TResult>(T1 arg1); (3) *delegate TResult Func&

Func 委托 和 Action 委托 初步谈论

继上篇EventHandler之后,继续填坑,简单了解下Func<TResult> 委托 和 Action 委托. msdn对于两者的解释: Func<TResult>:封装一个不具有参数但却返回 TResult 参数指定的类型值的方法. Action:封装一个方法,该方法不具有参数并且不返回值. 两者的区别在于:有无返回值. 至于 Func<T,TResult>.Func<T1,T2,TResult>.... Action<T>.Action&

委托delegate 泛型委托action&lt;&gt; 返回值泛型委托Func&lt;&gt; 匿名方法 lambda表达式 的理解

1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyBookDel myBookDel; //普通方法 public static void MathBook(int a) { Console.WriteLine("我是数学书" + a); } static void Main(string[] args) { myBookDel += Ma

C#系统委托之Action And Func

转自http://www.cnblogs.com/LittleFeiHu/p/4035166.html Action:封装一个方法,该方法不具有参数并且不返回值 public delegate void Action() Action<T>:Action的泛型实现了1到16个传入参数的定义,但是仍然没有返回值,得出结论Action不支持返回值,如果需要返回值请使用另一个系统委托Func public delegate void Action<in T>(T obj) ... pub

Func&lt;T&gt;与Action&lt;T&gt;委托泛型

Func<T>与Action<T>委托泛型介绍 .Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public delegate void Action(); public delegate void Action<T1>(T1 arg1); public delegate void Action<T1, T2>(T1 arg1

委托, 泛型委托,Func&lt;T&gt;和Action&lt;T&gt;

使用委托来做一些事情,大致思路是: 1.定义声明一个委托,规定输入参数和输出类型.2.写几个符合委托定义的方法.3.把方法列表赋值给委托4.执行委托 internal delegate int MyDelegate(); class Program { static void Main(string[] args) { MyDelegate d = ReturnOne; d += ReturnTwo; foreach (int i in GetAllReturnVals(d)) { Consol

Func 和 Action 委托

有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action.如下所示(下面的in表示参数,out表示返回结果): delegate TResult Func <out TResult> ();delegate TResult Func <in T, out TResult> (T arg);delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 ar

C# 通过Action委托提高代码的重用

如何通过Action重复的代码 其实提高代码的重用,有几个途径 a.继承 b.工具方法 c.使用委托 a,b两点都很容易理解,说一下"c"这一点,举个DataContext事务的例子 using(var context = new DataContext()) { context .BeginTransaction(); try { context.User.GetUser(); context.User.add(new User{name="xian"}); co

委托、Lambda表达式、事件系列05,Action委托与闭包

来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); Console.WriteLine(i); } 结果是期望能的2.但令人好奇的是:栈上的变量i是如何传递给Action委托的? 反编译进行查看,首先看Main方法对应的IL代码: 再看c_DisplayClass1的IL代码: 从中可以看出:→在托管堆上创建了一个名为c_DisplayClass1的实例→把