Сокет является коммуникационной конечной точкой. Сокет непосредственно не связан с семейством протокола TCP/IP, он может использоваться с любым протоколом Ваши системные поддержки. API сокета C ожидает, что Вы сначала получите пустой объект сокета от системы, которую можно тогда или связать с локальным адресом сокета (чтобы непосредственно получить входящий трафик для протоколов без установления соединения или принять запросы входящего соединения на протоколы с установлением соединения) или что можно соединиться с удаленным адресом сокета (для любого вида протокола). Можно даже сделать обоих, если Вы хотите управлять обоими, локальный адрес сокета, сокет связывается с и удаленный адрес сокета, с которым подключен сокет. Для протоколов без установления соединения, подключающих сокет, является даже дополнительным, но если Вы не делаете этого, необходимо ли будет также передать адрес назначения с каждым пакетом, который Вы хотите отправить по сокету как, как еще сокет знал бы, куда отправить эти данные в? Преимущество состоит в том, что можно использовать единственный сокет для отправки пакетов в различные адреса сокета. Как только Вам настроили Ваш сокет и возможно даже соединенный, полагаете, что он канал двунаправленной связи. Можно использовать его, чтобы передать данные некоторому месту назначения, и некоторое место назначения может использовать его для пасования назад данных Вам. То, что Вы пишете в сокет, отсылают и что было получено, доступно для чтения.
Порты, с другой стороны - что-то, что только имеют определенные протоколы стека протоколов TCP/IP. TCP и пакеты UDP имеют порты. Порт является просто простым числом. Комбинация исходного порта и целевого порта определяет канал передачи между двумя хостами. Например, у Вас может быть сервер, который должен быть обоими, простым сервером HTTP и простым FTP-сервером. Если бы теперь пакет прибывает для адреса того сервера, как это знало бы, является ли это пакетом для HTTP или FTP-сервера? Ну, это будет знать поэтому, поскольку сервер HTTP будет работать на порте 80 и FTP-сервер на порте 21, поэтому если пакет прибудет с целевым портом 80, это для сервера HTTP а не для FTP-сервера. Также пакет имеет исходный порт, так как без такого исходного порта, сервер мог только иметь одно соединение с одним IP-адресом за один раз. Исходный порт позволяет серверу отличить в других отношениях идентичные соединения: у них всех есть тот же целевой порт, например, порт 80, тот же целевой IP, всегда тот же адрес сервера и тот же исходный IP, как они все прибывают от того же клиента, но как у них есть другой источник порты, сервер может отличить их друг от друга. И когда сервер передает ответы обратно, он сделает так к порту, запрос прибыл из, тот способ, которым клиент может также отличить различные ответы, которые он получает.
Коллекция ObservableCollection имеет нет возможности узнать, вносите ли вы изменения в содержащиеся в нем объекты - если вы хотите получать уведомления об изменении этих объектов, вам также необходимо сделать эти объекты наблюдаемыми (например, заставив эти объекты реализовать INotifyPropertyChanged)
Вероятно, потому что элементы не имеют возможности предупреждать коллекцию, когда они редактируются - т.е. они могут быть не наблюдаемыми. Другие классы будут иметь аналогичное поведение - невозможно предупредить вас о каждом изменении в графе классов, на которые имеются ссылки.
В качестве временного решения вы можете извлечь объект из коллекции, а затем повторно вставить его после завершения обработки. Однако, в зависимости от ваших требований и модели параллелизма, это может сделать программу некрасивой. Это быстрый прием, который не подходит для всего, что требует качества.
Вместо этого вы можете реализовать коллекцию с помощью метода обновления, который специально запускает событие ContentChanged (не уверен в названии). Это некрасиво, но, по крайней мере, с этим довольно легко справиться.
В идеале, как говорит kragen2uk, было бы лучше сделать объекты наблюдаемыми и сделать ваш клиентский код чистым и простым.
см. Также этот вопрос .
Другой способ добиться этого - реализовать новый класс XXXViewModel, производный от DependencyObject, и поместить его в ObservableCollection.
для этого взгляда на это очень хорошее введение в MVVM: http://blog.lab49.com/archives/2650
пример для такого класса:
public class EntryViewModel : DependencyObject
{
private Entry _entry;
public EntryViewModel(Entry e)
{
_entry = e;
SetProperties(e);
}
private void SetProperties(Entry value)
{
this.Id = value.Id;
this.Title = value.Title;
this.CreationTimestamp = value.CreationTimestamp;
this.LastUpdateTimestamp = value.LastUpdateTimestamp;
this.Flag = value.Flag;
this.Body = value.Body;
}
public Entry Entry
{
get {
SyncBackProperties();
return this._entry;
}
}
public Int64 Id
{
get { return (Int64)GetValue(IdProperty); }
set { SetValue(IdProperty, value); }
}
// Using a DependencyProperty as the backing store for Id. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IdProperty =
DependencyProperty.Register("Id", typeof(Int64), typeof(EntryViewModel), new UIPropertyMetadata(new Int64()));
}}
здесь важные вещи: {{ 1}} - он является производным от DependencyObject - он работает с DependencyProperties для поддержки привязки данных WPF
br sargola