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]: Асинхронная операция в рамках одного потока?
От: GlebZ Россия  
Дата: 04.10.05 14:51
Оценка:
Здравствуйте, Аноним, Вы писали:

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"?
Перевожу для тех, кто по буржуйски не балакает. Здесь написано:

Асинхронный вызов
Вызов функции, которая выполняется раздельно так, что вызывающий мог продолжать выполнять инструкции без ожидания возврата функции.


С уважением, 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]: Асинхронная операция в рамках одного потока?
От: TK Лес кывт.рф
Дата: 04.10.05 15:00
Оценка: :)
Hello, "Tom"

> ТК асинхронный вызов метода с выполнением метода в текущем потоке это что

> то но чвно не асинхронный вызов. Это скорее отложенный чес асинхронный,
> так как всё равно выполянть буду его я а значит и ждать результата тоже
> буду я.

О, новый термин

Давай поподробней про отложенные вызовы
Чем отложенный вызов от асинхронного отличается? Можно рассмотреть на
ситуации, когда я откладываю вызов на "после перезагрузки".
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[10]: Асинхронная операция в рамках одного потока?
От: GlebZ Россия  
Дата: 04.10.05 15:08
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>латентно — скрыто, неявно

Oops. Немного ошибся. Только смысл фразы не меняется. Никаких упоминаний потоков здесь нет, и не может быть. Потоки — это всего лишь некоторые способы обеспечения асинхронности. Но не единственные. Тот кто скажет что Control.BeginInvoke или PostMessage — синхронные, то может в меня бросить камень.

С уважением, Gleb.
Асинхронная операция в рамках одного потока?
От: Аноним  
Дата: 04.10.05 15:20
Оценка:
Хотя тут обсуждался больше BeginRead для FileStream, наиболее наглядная выгода от асинхронности (по сравнению с многопоточностью) появляется в сетевых приложениях.

Для читающих по английски очень советую посмотреть в прошлом MSDN Magazine была классная статья об организации работы с сокетами в контексте многопоточного сервера. Там эти вопросы разбираются просто по косточкам. Но, на английском

Почему асинхронность так выгодна для сетевых работ? Потому, что сетевых клиентов может быть одновременно ОЧЕНЬ много! А скорость работы сети гарантировано черепашья.

Обрабатывать запросы в однопоточном режиме, по очереди уже никак не подоходит. А современные версии Windows не потянут десять тысяч потоков. Но зато в асинхронном режиме 10 тыс. пользователей вполне будут обрабатываться и "не жужжать".

P.S. Большое спасибо за скептицизм по отношению к статусу MVP. Побольше таких постов, чтобы нам в своём эмвипизме не замшеть


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[11]: Асинхронная операция в рамках одного потока?
От: Tom Россия http://www.RSDN.ru
Дата: 04.10.05 15:35
Оценка:
Здравствуйте, TK, Вы писали:

TK>Hello, "Tom"


>> ТК асинхронный вызов метода с выполнением метода в текущем потоке это что

>> то но чвно не асинхронный вызов. Это скорее отложенный чес асинхронный,
>> так как всё равно выполянть буду его я а значит и ждать результата тоже
>> буду я.

TK>О, новый термин


TK>Давай поподробней про отложенные вызовы

TK>Чем отложенный вызов от асинхронного отличается? Можно рассмотреть на
TK>ситуации, когда я откладываю вызов на "после перезагрузки".

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

Давай так, асинхронный вызов он асинхронен чему? И чему он будет асинхронен если выполняется
в текущем же потоке
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[11]: Асинхронная операция в рамках одного потока?
От: Tom Россия http://www.RSDN.ru
Дата: 04.10.05 15:35
Оценка: :)
GZ>С уважением, Gleb.

Можешь ответить на вопрос?

"Так вам не кажется, что слово "separately" это латентно "in some other thread"?"
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[12]: Асинхронная операция в рамках одного потока?
От: GlebZ Россия  
Дата: 04.10.05 15:45
Оценка:
Здравствуйте, Tom, Вы писали:

GZ>>С уважением, Gleb.


Tom>Можешь ответить на вопрос?


Tom>"Так вам не кажется, что слово "separately" это латентно "in some other thread"?"

Не вырывай из контекста. "separatly so that". Условие separatly построено строго. И никаких намеков на параллельное выполнение.

С уважением, Gleb.
Re[13]: Асинхронная операция в рамках одного потока?
От: Tom Россия http://www.RSDN.ru
Дата: 04.10.05 15:51
Оценка: :)
Здравствуйте, 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]: Асинхронная операция в рамках одного потока?
От: TK Лес кывт.рф
Дата: 04.10.05 16:03
Оценка: :)
Hello, "Tom"
>
> Отложенный в данном контексте отличается от асинхронного тем, что
> отложенный будет выполняться в текущем потоке.
>

ок. добъем терминологию Как называется общий механизм абстрагирующий
технологию вызова от конкретной реализации (отложенная/асинхронная в "твоем
понятии" )?

> Давай так, асинхронный вызов он асинхронен чему? И чему он будет

> асинхронен если выполняется
> в текущем же потоке

Асинхронный вызов асинхронен к самому моменту вызова. т.е. вызов
асинхронного метода не означает его мгновенного завершения. Зачем сюда надо
обязательно приплетать потоки совершенно не понятно...
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[13]: Асинхронная операция в рамках одного потока?
От: Tom Россия http://www.RSDN.ru
Дата: 04.10.05 16:07
Оценка:
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]: Асинхронная операция в рамках одного потока?
От: TK Лес кывт.рф
Дата: 04.10.05 16:19
Оценка:
Hello, "Tom"
>
> Затем, что обычно реализуются асинхронные вызовы через выполнение этого
> самого вызова где то отдельно и это отдельно почти всегда есть поток.

ок. давай по пунктам.

1. Асинхронный ввод/вывод (конкретно ReadFileEx из WinAPI) создает отдельный
поток для выполнения чтения?
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[14]: Асинхронная операция в рамках одного потока?
От: GlebZ Россия  
Дата: 04.10.05 16:25
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Хорошо, тогда скажи к чему болл применимо высказывание "...separatly so that...":

Tom>1. in the same thread
Tom>2. in the another thread
Да ни к чему из этого неприменимо. Ясно сказано — раздельно так, чтобы вызывающий мог продолжать выполнять инструкции без ожидания возврата функции. Если вызывающий поток ожидает возврата функции то это можно нельзя считать "раздельно". А если это не "раздельно" -> то это не асинхронный вызов. В какое время будет работать вызываемая функция — одновременно или после, несказано.
Плохо с понятиями, давай по коду. Надеюсь ты не будешь возражать что Control.BeginInvoke — асинхронен. Посмотрим на него на рефлектор.
//вызов BeginInvoke приводит к вызову этой функции с параметром synchronous=false
//вызов Invoke приводит к вызову этой функции с параметром synchronous=false
private object MarshaledInvoke(Control caller, Delegate method, object[] args, bool synchronous)
{
//скинуто как неинтересное
//..........
//скинуто как неинтересное
      bool flag1 = false;
//проверяем а не находимся ли в том же потоке в случае вызова Invoke
      if ((SafeNativeMethods.GetWindowThreadProcessId(new HandleRef(this, this.Handle), out num1) == SafeNativeMethods.GetCurrentThreadId()) && synchronous)
      {
            flag1 = true;
      }
//скинуто как неинтересное
//..........
//скинуто как неинтересное

      if (flag1)
      {
//выполняется только если мы уже находимся в потоке и это вызов Invoke
            this.InvokeMarshaledCallbacks();
      }
      else
      {
//если это вызов BeginInvoke или если это вызов Invoke и мы находимся в другом потоке  
            UnsafeNativeMethods.PostMessage(new HandleRef(this, this.Handle), Control.threadCallbackMessage, IntPtr.Zero, IntPtr.Zero);
      }
//главное отличие BeginInvoke от Invoke - мы здесь не дожидаемся а выходим
      if (!synchronous)
      {
            return entry1;
      }
//обеспечение синхронности вызова для Invoke
      if (!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]: Асинхронная операция в рамках одного потока?
От: Tom Россия http://www.RSDN.ru
Дата: 04.10.05 16:58
Оценка:
Здравствуйте, TK, Вы писали:

TK>Hello, "Tom"

>>
>> Затем, что обычно реализуются асинхронные вызовы через выполнение этого
>> самого вызова где то отдельно и это отдельно почти всегда есть поток.

TK>ок. давай по пунктам.


TK>1. Асинхронный ввод/вывод (конкретно ReadFileEx из WinAPI) создает отдельный

TK>поток для выполнения чтения?

ReadFileEx это синхронный вызов, и он сразу возвращает результат. Не путать асинхронынй вызов с асинхронным чтением (см выделенное). Вот если запустить поток в котором вызвать ReadFileEx это будет асинхронный вызов ReadFileEx, опять же не путать с асинхронным чтением.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Народная мудрось
всем все никому ничего(с).
Re[15]: Асинхронная операция в рамках одного потока?
От: Tom Россия http://www.RSDN.ru
Дата: 04.10.05 16:58
Оценка:
Здравствуйте, 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]: Асинхронная операция в рамках одного потока?
От: GlebZ Россия  
Дата: 04.10.05 17:20
Оценка:
Здравствуйте, 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 — не указ, код мы не читаем. Рычаги давления кончились, пойду домой и забуду про этот флейм. Благо смысла в нем, не на грош.

С уважением, Gleb.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.