Улучшение производительности многопоточного HttpWebRequests в.NET

Неустранимая ошибка: вызов функции-члена ... на не-объект

происходит с кодом, подобным xyz->method(), где xyz не является объектом и, следовательно, method не может

Это фатальная ошибка, которая остановит сценарий (уведомление о прямой совместимости: это станет захватывающей ошибкой, начиная с PHP 7).

Чаще всего это знак что в коде отсутствуют проверки условий ошибок. Убедитесь, что объект фактически является объектом перед вызовом его методов.

Пример типичного будет

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

В приведенном выше примере запрос не может и prepare() назначит false на $statement. Попытка вызвать метод execute() приведет к Fatal Error, потому что false является «не объектом», потому что значение является логическим.

Выясните , почему ваша функция вернула логическое значение вместо объекта. Например, проверьте объект $pdo для последней произошедшей ошибки. Подробности о том, как отлаживать это, будут зависеть от того, как обрабатываются ошибки для конкретной рассматриваемой функции / объекта / класса.

Если даже сбой ->prepare не выполняется, то ваш дескриптор

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

базы данных

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

не попал в текущий объем . Найдите, где он определился. Затем передайте его как параметр, сохраните его как свойство или поделите его через глобальную область.

Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например,

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.

Вопросы, относящиеся:

29
задан Community 23 May 2017 в 12:33
поделиться

5 ответов

Необходимо установить maxconnection параметр в app.config или web.config файле:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="80"/>
    </connectionManagement>
  </system.net>
</configuration>

Значения до 100 работ очень хорошо с Windows XP.

Обновление: я просто узнал, что метод выше является альтернативным способом установить Систему. Сеть. ServicePointManager. DefaultConnectionLimit

37
ответ дан Jader Dias 28 November 2019 в 01:49
поделиться

это могло быть ограничение соединения, которое было недавно наложено.

http://www.speedguide.net/read_articles.php?id=1497

и

http://www.mydigitallife.info/2007/04/09/windows-vista-tcpipsys-connection-limit-patch-for-event-id-4226/

2
ответ дан shaunf 28 November 2019 в 01:49
поделиться

Вы попытались увеличить макс. соединения в параметрах сети?

http://msdn.microsoft.com/en-us/library/fb6y0fyc.aspx

2
ответ дан shaunf 28 November 2019 в 01:49
поделиться

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

, Если Вы - действительно выполнение улучшения с 2 40 потоков exes, чем 1 80 потоков exe тогда, необходимо будет запустить расследование с совместно используемых ресурсов. И если это так, код, который Вы процитировали, намного менее интересен, чем код, который создает и управляет потоками.

другая вещь, которую я бросил бы там, существует несколько инструментов, которые можно получить, который сделает этот тип вещи для Вас в общем. См. http://support.microsoft.com/kb/231282 . Также включенный в Visual Studio (я не уверен, что skus) новое поколение инструментов тестирования производительности веб-приложения. И я уверен, смотрели ли Вы, Вы могли бы найти некоторый материал неMS также.

1
ответ дан Peter Oehlert 28 November 2019 в 01:49
поделиться

Как Вы создаете свои потоки? Я предполагаю, что, так как Вы знаете, у Вас есть 80 потоков, Вы не используете диспетчера пула потоков, потому что с диспетчером пула потоков можно попросить столько потоков, сколько Вам нравится, и Вы только получите 25 активных потоков за один раз. При создании потоков вручную с массивом тогда, Вы на самом деле получите столько, сколько Вам нужно, однако они находятся все еще в том же пространстве процесса, так, чтобы мог бы ограничить их по потокам, работающим в отдельных процессах.

Вы могли бы также изучить, с каким стилем квартиры потоки становятся созданными, я верю классу Потока ctor STA использования по умолчанию. Попробуйте MTA и посмотрите, влияют ли они на производительность.

-1
ответ дан LoveMeSomeCode 28 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: