C# concurrentqueue показывает исключение из памяти после запуска в течение нескольких часов
Привет. Я работаю с данными, которые генерируются каждую секунду. Я пытаюсь использовать ConcurrentQueue для постановки в очередь этого содержимого. Я добавил задачу, которая проверяет, превышает ли количество очередей 500. Если он больше 500, он удаляет содержимое в массив, и я отправляю массив. Вот как работает мое приложение. Но пробежав несколько часов, я получил следующее сообщение:
at (wrapper alloc) System.Object.AllocVector(intptr,intptr) at System.Collections.Concurrent.ConcurrentQueue`1+Segment[T]..ctor (System.Int32 boundedLength) [0x00006] in <f56c876907e742b0aa586f051fcce845>:0 at System.Collections.Concurrent.ConcurrentQueue`1[T].EnqueueSlow (T item) [0x00051] in <f56c876907e742b0aa586f051fcce845>:0 at System.Collections.Concurrent.ConcurrentQueue`1[T].Enqueue (T item) [0x00010] in <f56c876907e742b0aa586f051fcce845>:0Пожалуйста, помогите мне. Дайте мне предложения Соммы, чтобы решить эту проблему. Должен ли я использовать систему.Дженерик.Очередь вместо ConcurrentQueue?
Я использую следующие шаги:
1. считывает данные с последовательного порта и ставит их в очередь
ConcurrentQueue<int> queue1 = new ConcurrentQueue<int>(); queue1.enqueue(values)2. Для извлечения я использую следующие задания
public async Task PublishMessage() { int waittime =1; if (waittime != 0) { do { double[] testarray=new double[512]; if(queue1.Count>=512) { wavetest = new double[512]; for (int k = 0; k < 512; k++) { queue1.TryDequeue(out testarray[k]); } SendMessage(testarray); } await Task.Delay(waittime); } while (true); } }Спасибо
Что я уже пробовал:
Я попробовал посмотреть, увеличивается ли очередь со временем. Но нет. Количество очередей составляло около 250 человек в каждой. Она не увеличивалась быстро со временем.
Wendelius
Можете ли вы опубликовать код, который вы используете для добавления в очередь и удаления из нее
Member 13245297
Я делаю следующее:
1. считывает данные с последовательного порта и ставит их в очередь
Коллекции concurrentqueue И Л;int> В queue1 = новые коллекции concurrentqueue И Л;int&ГТ;();
queue1.enqueue(значения)
2. Для извлечения я использую следующие задания
публичная асинхронная задача PubMessage()
{
int waittime =1;
если (время ожидания != 0)
{
делать
{
double[] testarray=новый double[512];
if(queue1.Count>=512)
{
wavetest = новый двойной[512];
for (int k = 0; k < 512; k++)
{
queue1.TryDequeue(out testarray[k]);
}
SendMessage(testarray);
}
жду задания.Задержка(время ожидания);
}
в то время как (правда);
}
}
Patrice T
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
Member 13245297
Спасибо что ответили