2010-11-05 2 views
1

Кто-нибудь знает, как будет объявлен исходный код для указателей Func и Action? Я пытаюсь понять теорию создания асинхронного вызова с использованием делегатов и того, как это связано с потоковой обработкой.Func <> и примитивный код

Например, если у меня есть код ниже:

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 <> структура; причина, по которой я хотел бы понять это, состоит в том, что Func может принимать только входную и возвращаемую переменные. Это не позволяет гибкость дизайна в методе, на который он указывает.

Спасибо!

ответ

2

Func<int, string> только общий делегат. Это просто помогает избежать написания общих делегатов. Вот и все. Если это не подходит, вы должны написать свой собственный delagate. delagate заменить тот, который вы просите это

delegate string Method(int parm); 

если вы хотите FUNC (, для примера), который принимает 22 :-) целого числа и возвращает строку, вы должны написать у вас есть делегат

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); 
     } 
    } 
+0

Как я могу заменить этот экземпляр в вышеприведенном коде, чтобы я мог вызвать метод beginInvoke() и указать его методу Work()? – locoboy

+0

Взгляните на мой пост, я его отредактировал. Я могу ответить здесь только потому, что я должен опубликовать код –

+0

Спасибо, это ответ, который я искал – locoboy

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... 
+0

Малая точка - OP использует: 'делегат TResult Func (T Arg);' –

+0

извините я немного потерял. Сможете ли вы дать мне немного больше информации в декларации? Может быть, было бы лучше, если бы вы могли помочь мне в коде, когда я говорю «Func method = Work;». Как именно я могу заменить этот сегмент, используя ключевое слово 'delegate'? – locoboy

+0

@ cfarm54: Возможно, я неправильно понял ваш вопрос. Если вы хотите знать синтаксис для определения анонимных методов, это будет: 'Func method = delegate (string s) {return s.Length; }; '. Вы можете, конечно, использовать лямбда-синтаксис и быть более кратким: 'Func method = s => s.Length;'. Важно отметить, что анонимные методы никоим образом не ограничены делегатами 'Func' и' Action'. Они могут работать с любым типом делегата, который соответствует их подписи. –

Смежные вопросы