0

У меня есть список, в который постоянно добавляются элементы. Мой код:

public Task HandleApplicationMessageReceivedAsync( MqttApplicationMessageReceivedEventArgs eventArgs )           
{                                                                                                                
    return Dispatcher.UIThread.InvokeAsync( () =>                                                                
    {                                                                                                            
        if ( !IsRecordingEnabled ) return;                                                                       
        if ( ReceivedApplicationMessages.Count >= 10000 )                                                        
        {                                                                                                        
            ReceivedApplicationMessages.RemoveRange( 9999, ReceivedApplicationMessages.Count - 9999 );           
        }
    if ( FilterEditorViewModel.MarkedFields                                                                   
        .Any( x => eventArgs.ApplicationMessage.Topic                                                        
            .ToUpper()                                                                                       
            .Contains( x.ToUpper() ) ) )                                                                     
        return;                                                                                              

    ReceivedApplicationMessages.Insert( 0, new ReceivedApplicationMessageViewModel(                          
        _messageId++, eventArgs.ApplicationMessage ) );                                                      
} );                                                                                                          

}

Проблема в том, что добавляются они очень быстро, нет возможности вообще заметить что-то. Какая-то реактивная коллекция получилась. Пробовал добавлять раз в 1000мс, но получается рывками, что совсем не здорово:

var timer = new Timer( 1000 ) { AutoReset = false };
timer.Elapsed += ( sender, args ) => ChunkMessages();
NewMessageArrived += ( sender, args ) => { if ( !timer.Enabled ) timer.Start(); };

public Task HandleApplicationMessageReceivedAsync( MqttApplicationMessageReceivedEventArgs eventArgs ) { return Dispatcher.UIThread.InvokeAsync( () => { if ( ReceivedApplicationMessages.Count >= 10000 ) { ReceivedApplicationMessages.RemoveRange( 9999, ReceivedApplicationMessages.Count - 9999 ); }

     if ( FilterEditorViewModel.MarkedFields
           .Any( x => eventArgs.ApplicationMessage.Topic
           .ToUpper()
           .Contains( x.ToUpper() ) ) )
         return;

     ReceivedApplicationMessagesChunk.Insert( 0, new ReceivedApplicationMessageViewModel(
                _messageId++,
                eventArgs.ApplicationMessage ) );

     NewMessageArrived?.Invoke( null, EventArgs.Empty );
        } );
    }


private void ChunkMessages() { if ( !IsRecordingEnabled ) return; ReceivedApplicationMessages.InsertRange( 0, ReceivedApplicationMessagesChunk ); ReceivedApplicationMessagesChunk.Clear(); }

  • Зачем здесь диспетчер? Это UI приложение, какого типа? Xamarin? Вы вызываете диспетчер из стороннего потока? Пробовал добавлять раз в 1000мс - как именно? – aepot May 13 '22 at 15:14
  • Странный код вы показали, спрашиваете как замедлить добавление, а показываете метод, добавляющий одну запись. Покажите цикл, где их много. – aepot May 13 '22 at 15:20
  • Но я ведь все верно показал. Сообщение появляется и добавляется в коллекцию ReceivedApplicationMessages, это все. Это впф, где есть вью с листбоксом, к которому и биндится эта коллекция @aepot –  May 13 '22 at 15:26
  • Dispatcher.UIThread вроде отсутствует в WPF или я что-то попутал. – aepot May 13 '22 at 15:44
  • https://ru.stackoverflow.com/a/1409409/373567 сюда загляните – aepot May 13 '22 at 15:45

0 Answers0