2013-12-07 4 views
0

Я прочитал код, чтобы отправить электронную почту, здесь его часть:Почему выражение лямбда не имеет возвращаемого значения?

MailUserState state = new MailUserState() 
{ 
    AutoReleaseSmtp = m_autoDisposeSmtp, 
    CurMailMessage = mMailMessage, 
    CurSmtpClient = m_SmtpClient, 
    IsSmpleMail = true, 
    UserState = AsycUserState, 
}; 
if (m_autoDisposeSmtp) 
    m_SmtpClient = null; 

ThreadPool.QueueUserWorkItem((userState) => 
{ 
    MailUserState curUserState = userState as MailUserState; 
    curUserState.CurSmtpClient.SendAsync(mMailMessage, userState); 
}, state); 

Почему лямбда-выражение не имеет возвращаемого значения?

Я думаю, что shoud возвращает объект экземпляра callback.Но он не имеет оператора возврата. Почему?

+0

Куда он вернет значение? Что будет делать пул потоков с возвращаемым значением? – zerkms

+0

Функция QueueUserWorkItem имеет два параметра. – Dolphin

+1

Выражение лямбда _is_ a экземпляр WaitCallback (или конвертируемый в один, во всяком случае). Его не нужно возвращать. –

ответ

7

Почему выражение лямбда не имеет возвращаемого значения?

Первый аргумент метода ThreadPool.QueueUserWorkItem является WaitCallback делегат, который выглядит следующим образом:

public delegate void WaitCallback(object state) 

Так как вы можете видеть, что это функция принимает один параметр объекта и не имеющий возвращаемого значения. И это именно то, что выражение лямбда в вашем коде. Метод QueueUserWorkItem будет рисовать поток из пула потоков, если/когда он доступен, и он выполнит код в обратном вызове в этом потоке. Возвратного значения нет.

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