FUNC<>和原始代码

时间:2010-11-05 10:15:08

标签: c# .net multithreading delegates

有谁知道如何为Func和Action指针声明源代码?我试图理解使用委托进行异步调用的理论以及它与线程的关系。

例如,如果我有以下代码:

    static void Main()
{
  Func<string, int> method = Work;
  IAsyncResult cookie = method.BeginInvoke ("test", null, null);
  //
  // ... here's where we can do other work in parallel...
  //
  int result = method.EndInvoke (cookie);
  Console.WriteLine ("String length is: " + result);
}

static int Work (string s) { return s.Length; }

我如何使用'委托'类型来替换Func&lt;&gt;结构体;我想弄明白的原因是因为Func只能输入一个输入和一个返回变量。它不允许设计灵活性指向它。

谢谢!

2 个答案:

答案 0 :(得分:5)

Func<T>真的没什么特别的。这很简单:

public delegate T Func<T>();

事实上,为了支持不同数量的参数,有一些声明,如:

public delegate void Action();
public delegate void Action<T>(T arg);
public delegate U Func<T, U>(T arg);
// so on...

答案 1 :(得分:2)

Func<int, string>只是一个通用委托。它只是帮助您避免编写常见代理。而已。如果它不合适你应该写自己的delagate。 delagate替换你要问的是

delegate string Method(int parm);

如果你想要一个func(对于istance)需要22 :-) integer并返回一个字符串你必须写自己的委托

delegate string CrazyMethod(int parm1,int parm2,.....)

在你的情况下

 delegate int MyOwnDeletage(string d);
    class Program
    {

        static int Work(string s) { return s.Length; }

        static void Main(string[] args)
        {

            //  Func<string, int> method = Work; 
            MyOwnDeletage method =Work;

              IAsyncResult cookie = method.BeginInvoke ("test", null, null); 
              // 
              // ... here's where we can do other work in parallel... 
              // 
              int result = method.EndInvoke (cookie); 
              Console.WriteLine ("String length is: " + result); 
        }
    }