2016-06-06 6 views
2

В документации MSDN я видел как A, так и B. Как оба они оба используют WaitCallback? Почему различный синтаксис?Нужно ли мне WaitCallback?

А.

static void Main() 
{ 

    ThreadPool.QueueUserWorkItem(Foo); 
} 

static void Foo(Bar bar) 
{ 
    //do Stuff 
} 

B.

static void Main() 
{ 
    Bar bar = new Bar(); 
    ThreadPool.QueueUserWorkItem(new WaitCallBak(Foo), bar); 
} 

static void Foo(Bar bar) 
{ 
    //do Stuff 
} 

ответ

2

Ваш текущий код не будет компилироваться. WaitCallback is a delegate, который определяется как void Foo(object bar). Вы, следовательно, не может написать:

ThreadPool.QueueUserWorkItem(new WaitCallback(Foo), bar); 

Поскольку Foo определяется как void Foo(Bar bar), не void Foo(object bar). Теперь, если мы исправим сигнатуру Foo, то они эквивалентны.

C# обеспечивает синтаксический сахар, который позволяет вам вместо лямбда-выражения использовать группы лямбда-выражения и группы методов.

Так следующее:

ThreadPool.QueueUserWorkItem(new WaitCallback(Foo), bar); 
ThreadPool.QueueUserWorkItem(Foo, bar); 

эквивалентны.

+0

Спасибо. Предполагая, что я исправлю подпись Foo, могу ли я обойтись без выражения лямбда и придерживаться того, как я прошел Foo? Я спрашиваю, потому что MSDN использует этот синтаксис – AfterWorkGuinness

+1

@AfterWorkGuinness Оба идентичны - так что да, вы можете делать в любом случае :) – Rob

+0

Как вы можете отправить функцию ThreadPool, которая не является статической? Я видел этот http://stackoverflow.com/questions/5786501/how-to-use-threadpool-queueuserworkitem-with-non-static-methods, но почему он работает, если он не соответствует сигнатуре WaitCalback? – AfterWorkGuinness

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