У меня есть случай использования, в котором я хочу вставить и удалить пользовательский объект (запасы) из блокирующей коллекции (более крупное изображение представляет собой очередь производителей-потребителей).Удаление элементов из BlockingCollection и заполнение Наблюдаемая коллекция
Проблемы утверждение точно похож на эту тему - update an ObservableCollection with a BlockingCollection
Я не хочу использовать реактивные расширения, но хочу традиционный C# способа сделать эту логику (это жесткое требование, к сожалению, и полностью понять последствие). Мой фрагмент кода здесь
MainWindowViewModel.cs
public class MainWindow_VM : ViewModelBase
{
public ObservableCollection<StockModel> stocks { get; set; }
private readonly Dispatcher currentDispatcher;
private BlockingCollection<StockModel> tasks = new BlockingCollection<StockModel>();
#endregion
// All other standard ViewModel logic - Constructor, Command etc
private void handlermethod(object sender, MarketDataEventArgs e)
{
Task.Factory.StartNew(AddUpdateObservableCollection);
// Below thought process (maybe wrong) - How do i add the value to the BlockingCollection through a thread considering I have a ProducerConsumer class standard implementation (which has Enqueue and Dequeue Methods)
using (ProducerConsumerQueue q = new ProducerConsumerQueue())
{
foreach (Stock s in e.updatedstock)
{
StockModel sm = new StockModel();
sm.Symbol = s.Symbol;
sm.Bidprice = s.Bidprice;
q.EnqueueTask(s);
}
}
private void AddUpdateObservableCollection()
{
//Signalling mechanism still missing - when Stock comes into BlockingCollection - then this will start draining.
// Also have to take care of Dispatcher stuff since you can only update ObservableCollection through Dispatcher
foreach (StockModel sm in tasks)
{
if (sm != null)
{
if (stocks.Any(x => x.Symbol == sm.Symbol))
{
var found = stocks.FirstOrDefault(x => x.Symbol == sm.Symbol);
int i = stocks.IndexOf(found);
stocks[i] = sm;
}
else
{
stocks.Add(sm);
}
}
}
}
}
Вы добавляете и снимаете с BlockingCollection. – Paparazzi