powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
20 сообщений из 20, страница 1 из 1
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39010235
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть List<T>. Или Queue<T>. Не важно. Есть метод

AddData (IEnumerable<T> newData)
{
foreach(var data in newData)
myQueue.Enqueue(data);
}

Как гарантировать, что при очередном вызове AddData прошлый вызов этого метода успеет записать все данные в myQueue и новые данные не станут чередоваться с прошлыми? Т. е. хочу, чтобы все блоки newData были записаны в myQueue последовательно, без перемешки.

Штука ещё в том, что метод AddData может работать в WCF-сервисе (а может и в обычном настольном приложении форм или WPF - т. е. два случая).
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39010236
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл выделить код.
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39010248
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey2112новые данные не станут чередоваться с прошлыми?
с прошлыми или добавленными другим потоком?
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39010250
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилAlexey2112новые данные не станут чередоваться с прошлыми?
с прошлыми или добавленными другим потоком?
Я тут сам не уверен. У меня есть два варианта.

Первый - это когда другим потоком добавляешь.

Второй, это когда ты вызываешь одним потоком на клиенте метод службы много раз. Его второй раз нельзя вызвать, пока первый раз не отработает, если в одном потоке?

Извиняюсь, если тупые вопросы задаю - ничего в голове не осталось.
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39010272
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011079
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просьба модераторам - не переносите тему в WCF-раздел, т. к. тема на пограничье находится, так что пусть здесь продолжается.


Поясните, пожалуйста, кто-нибудь. Я сейчас создал WCF-службу и в ней метод, добавляющий коллекцию данных в Queue и в ConcurrentQueue с паузами между добавлениями через Thread.Sleep(500). Подробности см. в приведённом ниже коде.

Затем вызвал этот метод несколько раз с передачей в него коллекций значений. На выходе из службы получил для разных сочетаний вызова методов (неасинхронный и асинхронный, причём последний - с помощью встроенной в 2012 студию утилиты, которая по умолчанию создаёт Task-based асинхронные варианты методов) и типа коллекции следующее:

асинхронный вызов, ConcurrentQueue<T>

3
33
333
3333
1
11
111
1111
4
44
444
4444
2
22
222
2222


асинхронный вызов, Queue<T>

4
44
444
4444
1
11
111
1111
2
22
222
2222
3
33
333
3333


синхронный вызов, ConcurrentQueue<T>

1
11
111
1111
2
22
222
2222
3
33
333
3333
4
44
444
4444


синхронный вызов, Queue<T>

1
11
111
1111
2
22
222
2222
3
33
333
3333
4
44
444
4444



Т. е. парядок добавляемых элементов сохраняется всегда - вне зависимости от синхронности вызовов или многопоточных-однопоточных коллекций. А вот порядок добавляемых последовательностей - зависит от синхронности вызова добавляющего метода.

А вот код

служба (все настройки по умолчанию - только поведение на Single поменял, чтобы служба помнила состояние без использования байндинга, поддерживающего сессии)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
[ServiceContract]
public interface IService1
{

	[OperationContract]
	void AddData(IEnumerable<double> values);

	[OperationContract]
	IEnumerable<double> GetData();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service1 : IService1
{
	Queue<double> _q = new Queue<double>();
	ConcurrentQueue<double> _qq = new ConcurrentQueue<double>();

	public void AddData(IEnumerable<double> values)
	{
		foreach (var val in values)
		{
			_q.Enqueue(val);
			//_qq.Enqueue(val);

			Thread.Sleep(500);
		}
	}

	public IEnumerable<double> GetData()
	{
		return _q;
		//return _qq;
	}
}



клиент
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
namespace ConsoleApplication1
{
    class Program
    {
        static double[] v1 = new double[] { 1, 11, 111, 1111 };
        static double[] v2 = new double[] { 2, 22, 222, 2222 };
        static double[] v3 = new double[] { 3, 33, 333, 3333 };
        static double[] v4 = new double[] { 4, 44, 444, 4444 };

        static void Main(string[] args)
        {
            Service1Client client = new Service1Client();

            //client.AddData(v1);
            //client.AddData(v2);
            //client.AddData(v3);
            //client.AddData(v4);

            client.AddDataAsync(v1);
            client.AddDataAsync(v2);
            client.AddDataAsync(v3);
            client.AddDataAsync(v4);

            Console.WriteLine("Data has been sended.");

            Console.ReadKey();

            Console.WriteLine("This is your data:");

            foreach (var v in client.GetData())
                Console.WriteLine(v);

            Console.ReadKey();
        }
    }
}




Вопросы.

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

2. Почему порядок самих последовательностей нарушается, когда я использую асинхронный вызов добавляющего метода, даже если при этом используется ConcurrentQueue?
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011085
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какую вообще потокобезопасность гарантирует ConcurrentQueue<T>? Что позразумевается под потокобезопасностью в ConcurrentQueue<T>?

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

Этого я смог добиться на обычной Queue<T> при синхронном вызове метода службы. Зачем тут может понадобиться ConcurrentQueue<T>?

С другой стороны, при асинхронном добавлении последовательностей не спасает и ConcurrentQueue<T>. Так зачем она нужна тогда?
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011098
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey2112 1. Почему порядок внутри последовательностей всегда сохраняется, даже если я использую обычную Queue?
а как может в ОЧЕРЕДИ измениться?
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011105
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey2112 2. Почему порядок самих последовательностей нарушается, когда я использую асинхронный вызов добавляющего метода, даже если при этом используется ConcurrentQueue?
ConcurrentQueue понятия не имеет ни о каких "входящих последовательностях"
ConcurrentQueue обеспечивает потокобезопасность добавления/извлечения отдельно взятого элемента очереди
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011141
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилConcurrentQueue обеспечивает потокобезопасность добавления/извлечения отдельно взятого элемента очереди
Что это значит? Я читал МСДН про ConcurrentQueue - там написано thread-safe. Читаю оправдания Липперта про какой-то косяк в дотнете - он там начинает демагогию разводить про то, что можно по-разному понимать потокобезопасность и вообще "чего вы от меня хотите - я не многопоточный программист практически вообще".
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011143
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилAlexey2112 1. Почему порядок внутри последовательностей всегда сохраняется, даже если я использую обычную Queue?
а как может в ОЧЕРЕДИ измениться?
Разные потоки добавляют в очередь данные асинхронно. Почему все одноциферные числа сохраняют порядок? Должны же перемешаться - я специально усыплял поток на полсекунды, чтобы другие успели добавить.
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011148
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередь - это FIFO - первым вошёл - первым вышел
с чего порядок нарушаться должен?

потокобезопасность - для предотвращения разрушения внутренней структуры при одновременном добавлении/извлечении
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011155
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилОчередь - это FIFO - первым вошёл - первым вышел
с чего порядок нарушаться должен?

потокобезопасность - для предотвращения разрушения внутренней структуры при одновременном добавлении/извлечении
Когда я делаю

client.AddDataAsync(v1);
client.AddDataAsync(v2);
client.AddDataAsync(v3);
client.AddDataAsync(v4);

с чего в Queue сохраняется порядок добавленных v1-v4? Если бы это был метод в самой Queue, я бы ещё мог понять, что внутри самой очереди есть типа буфер, который запоминает последовательность вызова методов EnqueueRange или что-то такое. Но у Queue нет метода EnqueueRange, а внутри AddDataAsync я вызваю обычный Enqueue с паузой в полсекунды. Т. е. во время этой паузы ничто не мешает другим потокам вставить в очередь свои значения. Так почему же не вставляют?
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011162
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, кажется, понял. Тут ещё штука в том, что время на добавление всех 16 элементов с паузами по полсекунды всегда одинаково - 8 секунд. Независимо от того, синхронно или асинхронно я вызываю добавляющие методы. Т. е. методы AddDataAsync со своими Task всё равно ждут друг дружку, если сделать несколько их вызовов.

Т. е.

1. Пока с очередью работает один AddDataAsync, другие ждут.

2. А вот порядок, в котором эти AddDataAsync работают с очередью, может не совпадать с порядком, в котором они были вызваны.

Пункт 2 мне понятен. Пункт 1 - нет. Причём 1 выполняется и с Queue, и с ConcurrentQueue. Почему?
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011166
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey2112client.AddDataAsync
что за шняга?
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011167
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвремя на добавление всех 16 элементов с паузами по полсекунды всегда одинаково - 8 секунд. Независимо от того, синхронно или асинхронно я вызываю добавляющие методы
И независимо от того, использую я Queue или ConcurrentQueue. Т. е. во всех четырёх случаях моего теста время добавления элементов было одинаковым. Почему? Ведь в случае с ConcurrentQueue должно было быть не сильно больше 2 секунд - все вызовы AddDataAsync должны были начать работу почти одновременно, а не ждать друг друга?
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011169
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилAlexey2112client.AddDataAsync
что за шняга?
Клиенсткий прокси-класс для службы.

У меня всё стандартно из шаблонов студии. Создал два проекта - консольное приложение и службу. В службу вставил свой код выше. На клиенте - добавил ссылку на работающую службу (запустил её в студии по ф5) и мне сгенерился такой прокси-класс.
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011779
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey2112Клиенсткий прокси-класс для службы.\
малая нагрука и свезло
Alexey2112все вызовы AddDataAsync должны были начать работу почти одновременно, а не ждать друг друга?
пакеты через сетевой интерфейс последовательно передаются- никакой мистики (агрегирование здесь рассматривать не будем)

Что делать? - последовательность добавлять через одно обращение к сервису,
собственно в сервисе - при добавлении блокировать всю коллекцию

другими словами - цикл добавления элементов должен быть в сервисе, а не клиенте
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011834
Alexey2112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилмалая нагрука и свезло
Чего?

Изопропилпакеты через сетевой интерфейс последовательно передаются- никакой мистики (агрегирование здесь рассматривать не будем)
Да, но я на сервисе специально задержку поставил в полсекунды. Четыре добавления - 2 секунды задержка. Службу и клиент на одной машине запущены - задержек в передаче пакетов быть не должно. Почему по факту каждый асинхронный вызов метода службы ждал, пока другие методы отработают?

Получается, асинхронный вызов метода службы асинхронен только для клиента - для службы он по-прежнему синхронен?

Изопропил(агрегирование здесь рассматривать не будем)
Что за аггрегирование?

ИзопропилЧто делать? - последовательность добавлять через одно обращение к сервису,
собственно в сервисе - при добавлении блокировать всю коллекцию

другими словами - цикл добавления элементов должен быть в сервисе, а не клиенте
Так и так в сервисе цикл? Или вы и про добавление самих последовательностей?

У меня добавление элементов последовательности в очередь - в сервисе. А добавление последовательностей - на клиенте.
...
Рейтинг: 0 / 0
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
    #39011871
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey2112У меня добавление элементов последовательности в очередь - в сервисе. А добавление последовательностей - на клиенте.
целиком "последовательность" передавайте(одним обращением к сервису) и будет счастье
Alexey2112Что за аггрегирование?
агрегирование сетевых интерфейсов - это железо
Alexey2112Получается, асинхронный вызов метода службы асинхронен только для клиента - для службы он по-прежнему синхронен?
сервису абсолютно фиолетово что там у клиента с ожиданием завершения операции
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]