将数据从ConcurentBag传输到ObservableCollection的最合适,最高效的方法是什么?

时间:2019-07-15 22:41:23

标签: c# wpf

为了缩短加载时间,我根据自己的ObservableCollection类在应用程序中添加了ConcurentBagLogEntry

    public class LogEntryList
    {
        public ObservableCollection<LogEntry> LogEntries { get; set; }

        public LogEntryList()
        {
            LogEntries = new ObservableCollection<LogEntry>();
        }
    }

    public class LogEntryListCon
    {
        public ConcurrentBag<LogEntry> LogEntries { get; set; }

        public LogEntryListCon()
        {
            LogEntries = new ConcurrentBag<LogEntry>();
        }
    }

    public class LogEntry
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Time { get; set; }
        public string Date { get; set; }
        public string Thread { get; set; }
        public string OtherContext { get; set; }
        public string Data { get; set; }
        public string DataPreview { get; set; }
        public Brush BgColor { get; set; }
        public bool Selected { get; set; }
    }

我目前正在将ConcurentBag添加到以下内容中; txt文件中的每个日志条目都被拆分为一个字符串数组。

Parallel.For(0, logFileToStringArray.Length, (i) =>
{
    var line = logFileToStringArray[i];
    MakeLogEntry(i, line);
});

MakeLogEntry当前在CleanLogEntry上调用,它返回已解析并格式化的“ LogEntry”

private void MakeLogEntry(int id, string input)
{
    logEntryListCon.LogEntries.Add(CleanLogEntry(id, input));
}

该问题目前出现在此问题的结尾,当前我被迫使用Dispatcher.Invoke通过循环更新ObservableCollection,这会导致UI死锁,而且速度很慢。

Dispatcher.Invoke(() =>
{
    logEntryList.LogEntries.Clear();
    foreach (var logEntry in logEntryListCon.LogEntries)
    {
        logEntryList.LogEntries.Add((logEntry));
    }
});

我必须实现哪些选项才能达到不锁定UI并在两个集合之间移动数据的目的。还是我应该考虑使用另一种线程安全的存储机制,该机制可以与WPF绑定一起很好地工作?

0 个答案:

没有答案