Re[7]: Асинхронная операция в рамках одного потока?
От:
Аноним
Дата:
04.10.05 14:47
Оценка:
Здравствуйте, GlebZ, Вы писали:
GZ>Специально в MSDN нашел, не поленился: GZ>
GZ>Asynchronous call
GZ>A call to a function that is executed separately so that the caller can continue processing instructions without waiting for the function to return. Contrast with Synchronous call.
GZ>ЗЫ надеюсь это можно считать окончанием флейма
Так вам не кажется, что слово "separately" это латентно "in some other thread"?
Re[8]: Асинхронная операция в рамках одного потока?
GZ>>Asynchronous call
GZ>>A call to a function that is executed separately so that the caller can continue processing instructions without waiting for the function to return. Contrast with Synchronous call.
GZ>>ЗЫ надеюсь это можно считать окончанием флейма А>Так вам не кажется, что слово "separately" это латентно "in some other thread"?
Перевожу для тех, кто по буржуйски не балакает. Здесь написано:
Асинхронный вызов
Вызов функции, которая выполняется раздельно так, что вызывающий мог продолжать выполнять инструкции без ожидания возврата функции.
С уважением, Gleb.
Re[14]: Асинхронная операция в рамках одного потока?
От:
Аноним
Дата:
04.10.05 14:51
Оценка:
Здравствуйте, GlebZ, Вы писали:
GZ>Как он определяет что закончилась перекачка данных, это его личное дело. Я не знаю, и знать не хочу. У меня, во времена MSDOS, дополнительного потока не было, как не было и самих потоков как таковых. Результат операции определялся по порту микросхемы DMA.
Я скажу как — поток банально ждет (спит), но поверьте — это не тот поток, который в это время усиленно трудится над операциями, которые следуют после вызова асинхронной операции ввода-вывода.
Re[9]: Асинхронная операция в рамках одного потока?
От:
Аноним
Дата:
04.10.05 14:55
Оценка:
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, Аноним, Вы писали:
GZ>>>
GZ>>>Asynchronous call
GZ>>>A call to a function that is executed separately so that the caller can continue processing instructions without waiting for the function to return. Contrast with Synchronous call.
GZ>>>ЗЫ надеюсь это можно считать окончанием флейма А>>Так вам не кажется, что слово "separately" это латентно "in some other thread"? GZ>Перевожу для тех, кто по буржуйски не балакает. Здесь написано: GZ>
GZ>Асинхронный вызов
GZ>Вызов функции, которая выполняется раздельно так, что вызывающий мог продолжать выполнять инструкции без ожидания возврата функции.
Перевожу для тех кто не вникает в брутальные фразы и думает что кто-то по буржуйски не балакает.
"Так вам не кажется, что слово "separately" это латентно "in some other thread"?"
=
"Так вам не кажется, что слово "раздельно" подразумевает "в другом потоке"?"
латентно — скрыто, неявно
Re[10]: Асинхронная операция в рамках одного потока?
Hello, "Tom"
> ТК асинхронный вызов метода с выполнением метода в текущем потоке это что > то но чвно не асинхронный вызов. Это скорее отложенный чес асинхронный, > так как всё равно выполянть буду его я а значит и ждать результата тоже > буду я.
О, новый термин
Давай поподробней про отложенные вызовы
Чем отложенный вызов от асинхронного отличается? Можно рассмотреть на
ситуации, когда я откладываю вызов на "после перезагрузки".
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[10]: Асинхронная операция в рамках одного потока?
Здравствуйте, Аноним, Вы писали:
А>латентно — скрыто, неявно
Oops. Немного ошибся. Только смысл фразы не меняется. Никаких упоминаний потоков здесь нет, и не может быть. Потоки — это всего лишь некоторые способы обеспечения асинхронности. Но не единственные. Тот кто скажет что Control.BeginInvoke или PostMessage — синхронные, то может в меня бросить камень.
С уважением, Gleb.
Асинхронная операция в рамках одного потока?
От:
Аноним
Дата:
04.10.05 15:20
Оценка:
Хотя тут обсуждался больше BeginRead для FileStream, наиболее наглядная выгода от асинхронности (по сравнению с многопоточностью) появляется в сетевых приложениях.
Для читающих по английски очень советую посмотреть в прошлом MSDN Magazine была классная статья об организации работы с сокетами в контексте многопоточного сервера. Там эти вопросы разбираются просто по косточкам. Но, на английском
Почему асинхронность так выгодна для сетевых работ? Потому, что сетевых клиентов может быть одновременно ОЧЕНЬ много! А скорость работы сети гарантировано черепашья.
Обрабатывать запросы в однопоточном режиме, по очереди уже никак не подоходит. А современные версии Windows не потянут десять тысяч потоков. Но зато в асинхронном режиме 10 тыс. пользователей вполне будут обрабатываться и "не жужжать".
P.S. Большое спасибо за скептицизм по отношению к статусу MVP. Побольше таких постов, чтобы нам в своём эмвипизме не замшеть
Здравствуйте, TK, Вы писали:
TK>Hello, "Tom"
>> ТК асинхронный вызов метода с выполнением метода в текущем потоке это что >> то но чвно не асинхронный вызов. Это скорее отложенный чес асинхронный, >> так как всё равно выполянть буду его я а значит и ждать результата тоже >> буду я.
TK>О, новый термин
TK>Давай поподробней про отложенные вызовы TK>Чем отложенный вызов от асинхронного отличается? Можно рассмотреть на TK>ситуации, когда я откладываю вызов на "после перезагрузки".
Отложенный в данном контексте отличается от асинхронного тем, что отложенный будет выполняться в текущем потоке.
Давай так, асинхронный вызов он асинхронен чему? И чему он будет асинхронен если выполняется
в текущем же потоке
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[11]: Асинхронная операция в рамках одного потока?
Здравствуйте, Tom, Вы писали:
GZ>>С уважением, Gleb.
Tom>Можешь ответить на вопрос?
Tom>"Так вам не кажется, что слово "separately" это латентно "in some other thread"?"
Не вырывай из контекста. "separatly so that". Условие separatly построено строго. И никаких намеков на параллельное выполнение.
С уважением, Gleb.
Re[13]: Асинхронная операция в рамках одного потока?
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, Tom, Вы писали:
GZ>>>С уважением, Gleb.
Tom>>Можешь ответить на вопрос?
Tom>>"Так вам не кажется, что слово "separately" это латентно "in some other thread"?" GZ>Не вырывай из контекста. "separatly so that". Условие separatly построено строго. И никаких намеков на параллельное выполнение.
Хорошо, тогда скажи к чему болл применимо высказывание "...separatly so that...":
1. in the same thread
2. in the another thread
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[12]: Асинхронная операция в рамках одного потока?
Hello, "Tom" > > Отложенный в данном контексте отличается от асинхронного тем, что > отложенный будет выполняться в текущем потоке. >
ок. добъем терминологию Как называется общий механизм абстрагирующий
технологию вызова от конкретной реализации (отложенная/асинхронная в "твоем
понятии" )?
> Давай так, асинхронный вызов он асинхронен чему? И чему он будет > асинхронен если выполняется > в текущем же потоке
Асинхронный вызов асинхронен к самому моменту вызова. т.е. вызов
асинхронного метода не означает его мгновенного завершения. Зачем сюда надо
обязательно приплетать потоки совершенно не понятно...
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[13]: Асинхронная операция в рамках одного потока?
TK>ок. добъем терминологию Как называется общий механизм абстрагирующий TK>технологию вызова от конкретной реализации (отложенная/асинхронная в "твоем TK>понятии" )?
ТК, с понятиями у меня как то не очень,
я понятия лучше тебе оставлю
>> Давай так, асинхронный вызов он асинхронен чему? И чему он будет >> асинхронен если выполняется >> в текущем же потоке
TK>Асинхронный вызов асинхронен к самому моменту вызова. т.е. вызов TK>асинхронного метода не означает его мгновенного завершения. Зачем сюда надо TK>обязательно приплетать потоки совершенно не понятно...
Затем, что обычно реализуются асинхронные вызовы через выполнение этого самого вызова где то отдельно и это отдельно почти всегда есть поток.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[13]: Асинхронная операция в рамках одного потока?
От:
Аноним
Дата:
04.10.05 16:08
Оценка:
Здравствуйте, TK, Вы писали:
>> Давай так, асинхронный вызов он асинхронен чему? И чему он будет >> асинхронен если выполняется >> в текущем же потоке
TK>Асинхронный вызов асинхронен к самому моменту вызова. т.е. вызов TK>асинхронного метода не означает его мгновенного завершения.
А вызов синхронного метода что означает его мгновенное завершение?
Re[14]: Асинхронная операция в рамках одного потока?
Hello, "Tom" > > Затем, что обычно реализуются асинхронные вызовы через выполнение этого > самого вызова где то отдельно и это отдельно почти всегда есть поток.
ок. давай по пунктам.
1. Асинхронный ввод/вывод (конкретно ReadFileEx из WinAPI) создает отдельный
поток для выполнения чтения?
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[14]: Асинхронная операция в рамках одного потока?
Здравствуйте, Tom, Вы писали:
Tom>Хорошо, тогда скажи к чему болл применимо высказывание "...separatly so that...": Tom>1. in the same thread Tom>2. in the another thread
Да ни к чему из этого неприменимо. Ясно сказано — раздельно так, чтобы вызывающий мог продолжать выполнять инструкции без ожидания возврата функции. Если вызывающий поток ожидает возврата функции то это можно нельзя считать "раздельно". А если это не "раздельно" -> то это не асинхронный вызов. В какое время будет работать вызываемая функция — одновременно или после, несказано.
Плохо с понятиями, давай по коду. Надеюсь ты не будешь возражать что Control.BeginInvoke — асинхронен. Посмотрим на него на рефлектор.
//вызов BeginInvoke приводит к вызову этой функции с параметром synchronous=false
//вызов Invoke приводит к вызову этой функции с параметром synchronous=falseprivate object MarshaledInvoke(Control caller, Delegate method, object[] args, bool synchronous)
{
//скинуто как неинтересное
//..........
//скинуто как неинтересноеbool flag1 = false;
//проверяем а не находимся ли в том же потоке в случае вызова Invokeif ((SafeNativeMethods.GetWindowThreadProcessId(new HandleRef(this, this.Handle), out num1) == SafeNativeMethods.GetCurrentThreadId()) && synchronous)
{
flag1 = true;
}
//скинуто как неинтересное
//..........
//скинуто как неинтересноеif (flag1)
{
//выполняется только если мы уже находимся в потоке и это вызов Invokethis.InvokeMarshaledCallbacks();
}
else
{
//если это вызов BeginInvoke или если это вызов Invoke и мы находимся в другом потоке
UnsafeNativeMethods.PostMessage(new HandleRef(this, this.Handle), Control.threadCallbackMessage, IntPtr.Zero, IntPtr.Zero);
}
//главное отличие BeginInvoke от Invoke - мы здесь не дожидаемся а выходимif (!synchronous)
{
return entry1;
}
//обеспечение синхронности вызова для Invokeif (!entry1.IsCompleted)
{
entry1.AsyncWaitHandle.WaitOne();
}
if (entry1.exception != null)
{
throw entry1.exception;
}
return entry1.retVal;
}
Если caller находится в другом потоке, то вызов Invoke и BeginInvoke — одинаковы. Только для BeginInvoke — важно выйти не узнавая, выполнилась ли эта процедура, или нет.
Если caller находится в том-же потоке, то делегат для Invoke будет вызван немедленно, а для BeginInvoke — положен в очередь окна.
Пример, который по моему, показателен.
С уважением, Gleb.
Re[15]: Асинхронная операция в рамках одного потока?
От:
Аноним
Дата:
04.10.05 16:55
Оценка:
Здравствуйте, GlebZ, Вы писали: GZ>
...
GZ>
GZ>Если caller находится в том-же потоке, то делегат для Invoke будет вызван немедленно, а для BeginInvoke — положен в очередь окна.
А как ты думаешь кто возьмет его из очереди и выполнит?
Если это сделает вызывающий поток — то с тем же успехом можно было сделать этот вызов синхронным (только делать его в этом случае нужно было в другом определеннолм месте).
Например.
асинхронно:
делаем что-то 1;
асинхронный вызов (кладем в очередь окна);
делаем что-то долго 2;
достаем из очереди окна и делаем;
тоже самое синхронно с тем же успехом (выполнится еще быстрее)
делаем что-то 1;
делаем что-то долго 2;
синхронный вызов;
Re[15]: Асинхронная операция в рамках одного потока?
Здравствуйте, TK, Вы писали:
TK>Hello, "Tom" >> >> Затем, что обычно реализуются асинхронные вызовы через выполнение этого >> самого вызова где то отдельно и это отдельно почти всегда есть поток.
TK>ок. давай по пунктам.
TK>1. Асинхронный ввод/вывод (конкретно ReadFileEx из WinAPI) создает отдельный TK>поток для выполнения чтения?
ReadFileEx это синхронный вызов, и он сразу возвращает результат. Не путать асинхронынй вызов с асинхронным чтением (см выделенное). Вот если запустить поток в котором вызвать ReadFileEx это будет асинхронный вызов ReadFileEx, опять же не путать с асинхронным чтением.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Народная мудрось
всем все никому ничего(с).
Re[15]: Асинхронная операция в рамках одного потока?
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, Tom, Вы писали:
Tom>>Хорошо, тогда скажи к чему болл применимо высказывание "...separatly so that...": Tom>>1. in the same thread Tom>>2. in the another thread GZ>Да ни к чему из этого неприменимо. Ясно сказано — раздельно так, чтобы вызывающий мог продолжать выполнять инструкции без ожидания возврата функции. Если вызывающий поток ожидает возврата функции то это можно нельзя считать "раздельно".
Ты определись можно или нельзя.
GZ>А если это не "раздельно" -> то это не асинхронный вызов. В какое время будет работать вызываемая функция — одновременно или после, несказано. GZ>Плохо с понятиями, давай по коду.\
Да, с понятиями у меня точно плохо, слава богу у нас есть ТК
GZ>Надеюсь ты не будешь возражать что Control.BeginInvoke — асинхронен. Посмотрим на него на рефлектор. GZ>
GZ>//вызов BeginInvoke приводит к вызову этой функции с параметром synchronous=false
GZ>//вызов Invoke приводит к вызову этой функции с параметром synchronous=false
GZ>private object MarshaledInvoke(Control caller, Delegate method, object[] args, bool synchronous)
GZ>{
GZ>//скинуто как неинтересное
GZ>//..........
GZ>//скинуто как неинтересное
GZ> bool flag1 = false;
GZ>//проверяем а не находимся ли в том же потоке в случае вызова Invoke
GZ> if ((SafeNativeMethods.GetWindowThreadProcessId(new HandleRef(this, this.Handle), out num1) == SafeNativeMethods.GetCurrentThreadId()) && synchronous)
GZ> {
GZ> flag1 = true;
GZ> }
GZ>//скинуто как неинтересное
GZ>//..........
GZ>//скинуто как неинтересное
GZ> if (flag1)
GZ> {
GZ>//выполняется только если мы уже находимся в потоке и это вызов Invoke
GZ> this.InvokeMarshaledCallbacks();
GZ> }
GZ> else
GZ> {
GZ>//если это вызов BeginInvoke или если это вызов Invoke и мы находимся в другом потоке
GZ> UnsafeNativeMethods.PostMessage(new HandleRef(this, this.Handle), Control.threadCallbackMessage, IntPtr.Zero, IntPtr.Zero);
GZ> }
GZ>//главное отличие BeginInvoke от Invoke - мы здесь не дожидаемся а выходим
GZ> if (!synchronous)
GZ> {
GZ> return entry1;
GZ> }
GZ>//обеспечение синхронности вызова для Invoke
GZ> if (!entry1.IsCompleted)
GZ> {
GZ> entry1.AsyncWaitHandle.WaitOne();
GZ> }
GZ> if (entry1.exception != null)
GZ> {
GZ> throw entry1.exception;
GZ> }
GZ> return entry1.retVal;
GZ>}
GZ>
GZ>Если caller находится в другом потоке, то вызов Invoke и BeginInvoke — одинаковы. Только для BeginInvoke — важно выйти не узнавая, выполнилась ли эта процедура, или нет.
Код не смотрел, так как декомпиляция MS сборок — незаконна, а я не хочу учить понятия в местах отдалённых от рабочего.
GZ>Если caller находится в том-же потоке, то делегат для Invoke будет вызван немедленно, а для BeginInvoke — положен в очередь окна. GZ>Пример, который по моему, показателен.
А что он показывает? Как работает стандартный алгоритм SendMessage-а и оконные сообщения? Так это и так все уже лет 10 знают...
Дf и потом ты определись наконец что ты хочешь доказать?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Народная мудрось
всем все никому ничего(с).
Re[16]: Асинхронная операция в рамках одного потока?
Здравствуйте, Tom, Вы писали:
Tom>>>Хорошо, тогда скажи к чему болл применимо высказывание "...separatly so that...": Tom>>>1. in the same thread Tom>>>2. in the another thread GZ>>Да ни к чему из этого неприменимо. Ясно сказано — раздельно так, чтобы вызывающий мог продолжать выполнять инструкции без ожидания возврата функции. Если вызывающий поток ожидает возврата функции то это можно нельзя считать "раздельно". Tom>Ты определись можно или нельзя.
Oops. описка. Ессно нельзя. Доказательство от противного.
GZ>>Если caller находится в другом потоке, то вызов Invoke и BeginInvoke — одинаковы. Только для BeginInvoke — важно выйти не узнавая, выполнилась ли эта процедура, или нет. Tom>Код не смотрел, так как декомпиляция MS сборок — незаконна, а я не хочу учить понятия в местах отдалённых от рабочего.
Ну уж ляниво по интеру бегать. Подай в суд.
GZ>>Если caller находится в том-же потоке, то делегат для Invoke будет вызван немедленно, а для BeginInvoke — положен в очередь окна. GZ>>Пример, который по моему, показателен. Tom>А что он показывает? Как работает стандартный алгоритм SendMessage-а и оконные сообщения? Так это и так все уже лет 10 знают...
Он показывает, что асинхронный делегат в BeginInvoke будет вызываться в том же потоке, и будет вызван не во время работы вызывающей функции а только после. То есть, параллельности здесь никакой. И следовательно, в концепции неважно same это поток, или other. Она небось и не знает что такое поток. Это не все-таки не термин языка, а термин windows.
Tom>Дf и потом ты определись наконец что ты хочешь доказать?
Дf уже и доказывать ничего не буду. Надоело.
MSDN — не указ, код мы не читаем. Рычаги давления кончились, пойду домой и забуду про этот флейм. Благо смысла в нем, не на грош.