Просто найдите подтверждение или документацию о том, как потоки используются для асинхронных шаблонов в сокетах под Windows CE, в частности, для BeginRead сокета. Я просмотрел документацию MSDN, но я могу найти только неопределенные ссылки. Я искал здесь его и нашел ответы на настольную модель потоков. В качестве дополнительной заметки программа реализована в Compact Framework.Модель поточной печати Windows CE 6.0 для BeginRead/EndRead?
Мое понимание таково: На рабочем столе, вызывающем BeginXXX, обратный вызов может быть вызван или не вызван другим потоком, кроме потока, вызывающего BeginXXX. (Взято из ThreadPool из того, что я читал и экспериментировал)
В Windows CE при вызове BeginXXX обратный вызов обрабатывается потоком, который сделал вызов BeginXXX.
Насколько это точно? Если да, где я могу найти документацию на нем? STW не помогло, и RTM тоже.
Это не документировано по уважительной причине, вы должны * предположить, что обратный вызов может быть выполнен в потоке завершения ввода-вывода. Никаких ярлыков не допускается, игнорируя это, вы попадете в неприятности. Конечно, можно получить обратный вызов в том же потоке, который случается, когда достаточное количество данных буферизуется. Скорее всего, это произойдет на устройстве с медленным процессором. –
@HansPassant 'предполагает, что обратный вызов может быть выполнен в потоке завершения ввода-вывода - да. Я не вижу, как инициирующий поток может быть сигнализирован для выполнения обратного вызова, если IO не будет выполняться синхронно или не потребует «предупреждающих» вызовов. Исходный поток может быть занят во время обратного вызова или, возможно, даже не существует. –
Я не могу представить, что было бы повод не документировать его. Мое приложение получает сообщения в сокете с BeginReceive. Я посылаю команды с Send(). Отправленные команды приводят к приему «OK», полученному async. Некоторые ОК, я должен ждать. Я использую ManualResetEvent для WaitOne() для OK после этих команд. Это ВСЕГДА истекает, и в течение этого таймаута я не получаю ничего в этом сокете. По завершении события сброса я получаю OK. Единственный способ объяснить это, если вызывающий поток - это тот, который, как ожидается, обработает обратный вызов от BeginReceive. –