Сокет c#/.Net. Завершение работы

Почему PowerShell применяет предикат Where к пустому списку?

Поскольку ConvertFrom-Json говорит Where-Object не пытаться перечислять свои выходные данные. [1122 ]

Поэтому PowerShell пытается получить доступ к свойству name в самом пустом массиве, как если бы мы делали:

$emptyArray = New-Object object[] 0
$emptyArray.name

Когда вы заключаете ConvertFrom-Json в скобки, powershell интерпретирует его как отдельный конвейер , который выполняется и завершает до , любой вывод может быть отправлен на Where-Object, и поэтому Where-Object может не знать, что ConvertFrom-Json хотел, чтобы он рассматривал массив как таковой .


Мы можем воссоздать это поведение в powershell, явно вызвав Write-Output с набором параметров переключателя -NoEnumerate:

# create a function that outputs an empty array with -NoEnumerate
function Convert-Stuff 
{
  Write-Output @() -NoEnumerate
}

# Invoke with `Where-Object` as the downstream cmdlet in its pipeline
Convert-Stuff | Where-Object {
  # this fails
  

Почему PowerShell применяет предикат Where к пустому списку?

Поскольку ConvertFrom-Json говорит Where-Object не пытаться перечислять свои выходные данные. [1122 ]

Поэтому PowerShell пытается получить доступ к свойству name в самом пустом массиве, как если бы мы делали:

[110]

Когда вы заключаете ConvertFrom-Json в скобки, powershell интерпретирует его как отдельный конвейер , который выполняется и завершает до , любой вывод может быть отправлен на Where-Object, и поэтому Where-Object может не знать, что ConvertFrom-Json хотел, чтобы он рассматривал массив как таковой .


Мы можем воссоздать это поведение в powershell, явно вызвав Write-Output с набором параметров переключателя -NoEnumerate:

[111]

Write-Output -NoEnumerate внутренне вызывает Cmdlet.WriteObject(arg, false), что, в свою очередь, вызывает время выполнения до , а не , перечисляет значение arg во время привязки параметра к нижестоящему командлету (в вашем случае Where-Object)


Почему это желательно? [ 1127]

В конкретном контексте синтаксического анализа JSON такое поведение действительно может быть желательным:

$data = '[]', '[]', '[]', '[]' |ConvertFrom-Json

Если бы я не ожидал ровно 5 объектов из ConvertFrom-Json теперь, когда я передал 5 допустимых JSON документы на это? : -) [тысяча сто двадцать девять].nonexistingproperty = 'fail' } # Invoke in separate pipeline, pass result to `Where-Object` subsequently $stuff = Convert-Stuff $stuff | Where-Object { # nothing happens

Почему PowerShell применяет предикат Where к пустому списку?

Поскольку ConvertFrom-Json говорит Where-Object не пытаться перечислять свои выходные данные. [1122 ]

Поэтому PowerShell пытается получить доступ к свойству name в самом пустом массиве, как если бы мы делали:

[110]

Когда вы заключаете ConvertFrom-Json в скобки, powershell интерпретирует его как отдельный конвейер , который выполняется и завершает до , любой вывод может быть отправлен на Where-Object, и поэтому Where-Object может не знать, что ConvertFrom-Json хотел, чтобы он рассматривал массив как таковой .


Мы можем воссоздать это поведение в powershell, явно вызвав Write-Output с набором параметров переключателя -NoEnumerate:

[111]

Write-Output -NoEnumerate внутренне вызывает Cmdlet.WriteObject(arg, false), что, в свою очередь, вызывает время выполнения до , а не , перечисляет значение arg во время привязки параметра к нижестоящему командлету (в вашем случае Where-Object)


Почему это желательно? [ 1127]

В конкретном контексте синтаксического анализа JSON такое поведение действительно может быть желательным:

$data = '[]', '[]', '[]', '[]' |ConvertFrom-Json

Если бы я не ожидал ровно 5 объектов из ConvertFrom-Json теперь, когда я передал 5 допустимых JSON документы на это? : -) [тысяча сто двадцать девять].nonexistingproperty = 'meh' }

Write-Output -NoEnumerate внутренне вызывает Cmdlet.WriteObject(arg, false), что, в свою очередь, вызывает время выполнения до , а не , перечисляет значение arg во время привязки параметра к нижестоящему командлету (в вашем случае Where-Object)


Почему это желательно? [ 1127]

В конкретном контексте синтаксического анализа JSON такое поведение действительно может быть желательным:

$data = '[]', '[]', '[]', '[]' |ConvertFrom-Json

Если бы я не ожидал ровно 5 объектов из ConvertFrom-Json теперь, когда я передал 5 допустимых JSON документы на это? : -) [тысяча сто двадцать девять]

5
задан Mykroft 24 February 2009 в 21:22
поделиться

2 ответа

На основе сокета. Разъединение

Если необходимо назвать Разъединение без первого Завершения работы вызова, можно установить опцию DontLinger Socket на ложь и указать ненулевой интервал тайм-аута, чтобы гарантировать, что данные, поставленные в очередь для исходящей передачи, отправляются. Разъединение затем блокируется, пока данные не отправляются или пока указанный тайм-аут не истекает. Если Вы устанавливаете DontLinger на ложь и указываете нулевой интервал тайм-аута, Близкие выпуски соединение, и автоматически отбрасывает поставленные в очередь данные выхода.

Предполагает, что Завершение работы на высоте ненужное...

3
ответ дан 14 December 2019 в 19:27
поделиться

Для повторного использования сокета используйте:

socket.Shutdown(SocketShutdown.Both);
socket.Disconnect(true);

Для принудительного закрытия используйте:

socket.Shutdown(SocketShutdown.Both);
socket.Close();
2
ответ дан 14 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

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