@INTERNALINTERFERENCE

Как реализовать многопоточное отправление данных в коллекцию?

У меня есть коллекция, в которую постоянно прилетают данные. Потом данные раз в секунду отправляются в другую коллекцию, а исходная очищается. Иногда появляется ошибка: destination array was not long enough. check destindex and length and the array's lower bounds. Как я понял, это из-за одновременной модификации потоков, но не знаю, как исправить.
Вот мой код:

public SubscriptionsPageViewModel( )                                    
{                                                                                                                                                                                                                                                                          
    var timer = new Timer( 1000 ) {AutoReset = false};                                                      
    timer.Elapsed += ( sender, args ) => ChunkMessages();                                                   
    NewMessageArrived += (sender, args) => { if (!timer.Enabled) timer.Start(); };                          
}                                                                                                           
public static event EventHandler? NewMessageArrived;
public ViewModelCollection<ReceivedApplicationMessageViewModel> ReceivedApplicationMessages { get; } = new ();    
public ViewModelCollection<ReceivedApplicationMessageViewModel> ReceivedApplicationMessagesChunk { get; } = new();
                                                                                                                  
public Task HandleApplicationMessageReceivedAsync( MqttApplicationMessageReceivedEventArgs eventArgs )            
{                                                                                                                 
    return Dispatcher.UIThread.InvokeAsync( () =>                                                                 
    {                                                                                                             
        if ( ReceivedApplicationMessages.Count >= 10000 )                                                         
        {                                                                                                         
             ReceivedApplicationMessages.Clear();                                                                 
             _messageId = 0;                                                                                      
        }                                                                                                         
                                                                                                                  
        ReceivedApplicationMessagesChunk.Insert( 0, new ReceivedApplicationMessageViewModel(                      
            _messageId++,                                                                                         
            eventArgs.ApplicationMessage ) );                                                                     
                                                                                                                  
        NewMessageArrived?.Invoke(null, EventArgs.Empty);                                                         
    } );                                                                                                           
}                                                                                                                 
                                                                                                                  
private void ChunkMessages()                                                                                      
{                                                                                                                 
    ReceivedApplicationMessages.AddOrInsertRange( ReceivedApplicationMessagesChunk, 0 );                          
    ReceivedApplicationMessagesChunk.Clear();                                                                     
}
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы