Ответ 1
Если ваш класс StockModel.Quotation позволяет это, вы можете создать пул, чтобы ограничить количество созданных новых объектов. Это техника, которую они иногда используют в играх, чтобы предотвратить сборщик мусора в середине рендеринга.
Вот базовая реализация пула:
class StockQuotationPool
{
private List<StockQuotation> poolItems;
private volatile int itemsInPool;
public StockQuotationPool(int poolSize)
{
this.poolItems = new List<StockQuotation>(poolSize);
this.itemsInPool = poolSize;
}
public StockQuotation Create(string name, decimal value)
{
if (this.itemsInPool == 0)
{
// Block until new item ready - maybe use semaphore.
throw new NotImplementedException();
}
// Items are in the pool, but no items have been created.
if (this.poolItems.Count == 0)
{
this.itemsInPool--;
return new StockQuotation(name, value);
}
// else, return one in the pool
this.itemsInPool--;
var item = this.poolItems[0];
this.poolItems.Remove(item);
item.Name = name;
item.Value = value;
return item;
}
public void Release(StockQuotation quote)
{
if (!this.poolItems.Contains(quote)
{
this.poolItems.Add(quote);
this.itemsInPool++;
}
}
}
Предположим, что StockQuotation выглядит примерно так:
class StockQuotation
{
internal StockQuotation(string name, decimal value)
{
this.Name = name;
this.Value = value;
}
public string Name { get; set; }
public decimal Value { get; set; }
}
Затем вместо вызова нового конструктора StockQuotation() вы задаете пул для нового экземпляра. Пул возвращает существующий экземпляр (вы можете предварительно создать их, если хотите) и задает все свойства, чтобы он выглядел как новый экземпляр. Возможно, вам придется поиграть, пока не найдете размер пула, который достаточно большой, чтобы одновременно разместить потоки.
Вот как вы могли бы назвать это из потока.
// Get the pool, maybe from a singleton.
var pool = new StockQuotationPool(100);
var quote = pool.Create("test", 1.00m);
try
{
// Work with quote
}
finally
{
pool.Release(quote);
}
Наконец, этот класс на данный момент не является потокобезопасным. Дайте мне знать, если вам нужна помощь в создании этого.