为了缩短加载时间,我根据自己的ObservableCollection
类在应用程序中添加了ConcurentBag
和LogEntry
。
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绑定一起很好地工作?