Я использую .net 4.5.2 У меня есть поток, который сделал синхронный вызов httpwebrequest.getResponse () , и я ожидаю, что этот поток будет сидеть там до получения ответа. Тем не менее, у меня есть пользовательский класс журнала, который выводит управляющий threadThreadId для каждого оператора журнала, и я вижу, что этот поток выполняет другую работу, в то время как ответ IO находится на рассмотрении. Это особенно хлопотно, потому что этот же поток имеет блокировку конфиденциального кода и может повторно входить (он все еще сохраняет блокировку) и повторно предъявляет код. В конечном итоге тот же поток действительно получает первоначальный ответ и продолжает обрабатывать данные. Проблема в том, что этот поток имеет «запустить amcuck», используя блокировку, которую он удерживает для доступа к коду, он не должен был достичь. ) вокруг синхронного вызова ввода -вывода. Да, я согласен, не оптимально, но в этом случае в этом случае журнал. Возможно, два запроса были фактически обработаны синхронно. Я знаю, что эти запросы обрабатываются параллельно, поскольку инициализируются () вызов, прежде чем мы попытаемся получить новые данные. Это приводит к тому, что данные добавляются в структуры дважды. Есть ли здесь какая -то оптимизация ввода -вывода? < /P>
public MyClass()
{
_stateLock = new Object();
}
public void UpdateData()
{
lock (_stateLock)
{
if (RefreshNeeded())
{
Logger.instance.LogTrace(String.Format(
"UpdateData device table Refresh Start",
_device.Name, TableName));
InitializeStructures();
Logger.instance.LogTrace(String.Format(
"UpdateData device table fetch data",
_device.Name, TableName));
String request = "https://www.google.com/";
HttpWebRequest getRequest =
WebRequest.CreateHttp(request);
getRequest.Method = "GET";
getRequest.ContentType = "application/x-www-form-urlencoded";
Logger.instance.LogTrace(String.Format(
"Issue Device GET: device request ",
_device.Name, request));
using (HttpWebResponse response = (HttpWebResponse)getRequest.GetResponse()) // sync wait for response
{
using (Stream receiveStream = response.GetResponseStream())
{
// read from stream using sync calls
}
}
Logger.instance.LogTrace(String.Format(
"UpdateData device table map data",
_device.Name, TableName));
RefreshStructures();
}
}
}
< /code>
output: < /p>
// First request processed by thread 37
20250201-11:52:09:969 :Trace: UpdateData device table RefreshStart
20250201-11:52:09:969 :Trace: UpdateData device table fetch data
20250201-11:52:09:969 :Trace: Issue Device GET: device request
No more log entries for thread 37. Assume it is trapped waiting for GetResponse()
...
// Wait a minute, thread 37 is processing ANOTHER request for same device table, but this time it processes the whole request
20250201-11:52:15:641 :Trace: UpdateData device table RefreshStart
20250201-11:52:15:641 :Trace: UpdateData device table fetch data
20250201-11:52:15:641 :Trace: Issue Device GET: device request
20250201-11:52:15:710 :Trace: UpdateData device table map data
...
// Thread 37 now seems to process the response from the FIRST request
20250201-11:52:17:230 :Trace: UpdateData device table map data
Подробнее здесь: https://stackoverflow.com/questions/794 ... hronous-io
Обработка потока Другая работа в ожидании синхронного ввода -вывода? ⇐ C#
Место общения программистов C#
1738456372
Anonymous
Я использую .net 4.5.2 У меня есть поток, который сделал синхронный вызов httpwebrequest.getResponse () , и я ожидаю, что этот поток будет сидеть там до получения ответа. Тем не менее, у меня есть пользовательский класс журнала, который выводит управляющий threadThreadId для каждого оператора журнала, и я вижу, что этот поток выполняет другую работу, в то время как ответ IO находится на рассмотрении. Это особенно хлопотно, потому что этот же поток имеет блокировку конфиденциального кода и может повторно входить (он все еще сохраняет блокировку) и повторно предъявляет код. В конечном итоге тот же поток действительно получает первоначальный ответ и продолжает обрабатывать данные. Проблема в том, что этот поток имеет «запустить amcuck», используя блокировку, которую он удерживает для доступа к коду, он не должен был достичь. ) вокруг синхронного вызова ввода -вывода. Да, я согласен, не оптимально, но в этом случае в этом случае журнал. Возможно, два запроса были фактически обработаны синхронно. Я знаю, что эти запросы обрабатываются параллельно, поскольку инициализируются () вызов, прежде чем мы попытаемся получить новые данные. Это приводит к тому, что данные добавляются в структуры дважды. Есть ли здесь какая -то оптимизация ввода -вывода? < /P>
public MyClass()
{
_stateLock = new Object();
}
public void UpdateData()
{
lock (_stateLock)
{
if (RefreshNeeded())
{
Logger.instance.LogTrace(String.Format(
"UpdateData device table Refresh Start",
_device.Name, TableName));
InitializeStructures();
Logger.instance.LogTrace(String.Format(
"UpdateData device table fetch data",
_device.Name, TableName));
String request = "https://www.google.com/";
HttpWebRequest getRequest =
WebRequest.CreateHttp(request);
getRequest.Method = "GET";
getRequest.ContentType = "application/x-www-form-urlencoded";
Logger.instance.LogTrace(String.Format(
"Issue Device GET: device request ",
_device.Name, request));
using (HttpWebResponse response = (HttpWebResponse)getRequest.GetResponse()) // sync wait for response
{
using (Stream receiveStream = response.GetResponseStream())
{
// read from stream using sync calls
}
}
Logger.instance.LogTrace(String.Format(
"UpdateData device table map data",
_device.Name, TableName));
RefreshStructures();
}
}
}
< /code>
output: < /p>
// First request processed by thread 37
20250201-11:52:09:969 :Trace: UpdateData device table RefreshStart
20250201-11:52:09:969 :Trace: UpdateData device table fetch data
20250201-11:52:09:969 :Trace: Issue Device GET: device request
No more log entries for thread 37. Assume it is trapped waiting for GetResponse()
...
// Wait a minute, thread 37 is processing ANOTHER request for same device table, but this time it processes the whole request
20250201-11:52:15:641 :Trace: UpdateData device table RefreshStart
20250201-11:52:15:641 :Trace: UpdateData device table fetch data
20250201-11:52:15:641 :Trace: Issue Device GET: device request
20250201-11:52:15:710 :Trace: UpdateData device table map data
...
// Thread 37 now seems to process the response from the FIRST request
20250201-11:52:17:230 :Trace: UpdateData device table map data
Подробнее здесь: [url]https://stackoverflow.com/questions/79405726/thread-processing-other-work-while-waiting-for-synchronous-io[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия