Обработка потока Другая работа в ожидании синхронного ввода -вывода?C#

Место общения программистов C#
Ответить
Anonymous
 Обработка потока Другая работа в ожидании синхронного ввода -вывода?

Сообщение Anonymous »

Я использую .net 4.5.2 У меня есть поток, который сделал синхронный вызов httpwebrequest.getResponse (), и я ожидаю, что этот поток будет сидеть там до получения ответа. Тем не менее, у меня есть пользовательский класс ведения журнала, который выводит управляющий sturishID для каждого оператора журнала, и я вижу, что этот поток выполняет другую работу, в то время как ответ 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();
}
}
}

// 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»