using System; using System.Collections; using System.Collections.ObjectModel; using System.Threading; using System.Windows.Data; namespace DS4WinWPF.DS4Forms.ViewModels { public class LogViewModel { //private object _colLockobj = new object(); private ReaderWriterLockSlim _logListLocker = new ReaderWriterLockSlim(); private ObservableCollection logItems = new ObservableCollection(); public ObservableCollection LogItems => logItems; public ReaderWriterLockSlim LogListLocker => _logListLocker; public LogViewModel(DS4Windows.ControlService service) { string version = DS4Windows.Global.exeversion; logItems.Add(new LogItem { Datetime = DateTime.Now, Message = $"DS4Windows version {version}" }); //logItems.Add(new LogItem { Datetime = DateTime.Now, Message = "DS4Windows version 2.0" }); //BindingOperations.EnableCollectionSynchronization(logItems, _colLockobj); BindingOperations.EnableCollectionSynchronization(logItems, _logListLocker, LogLockCallback); service.Debug += AddLogMessage; DS4Windows.AppLogger.GuiLog += AddLogMessage; } private void LogLockCallback(IEnumerable collection, object context, Action accessMethod, bool writeAccess) { if (writeAccess) { _logListLocker.EnterWriteLock(); } else { _logListLocker.EnterReadLock(); } accessMethod?.Invoke(); if (writeAccess) { _logListLocker.ExitWriteLock(); } else { _logListLocker.ExitReadLock(); } } private void AddLogMessage(object sender, DS4Windows.DebugEventArgs e) { LogItem item = new LogItem { Datetime = e.Time, Message = e.Data, Warning = e.Warning }; _logListLocker.EnterWriteLock(); logItems.Add(item); _logListLocker.ExitWriteLock(); //lock (_colLockobj) //{ // logItems.Add(item); //} } } }