Привет.
Я пытаюсь реализовать многопоточный код в приложении. Целью этого кода является проверка элементов, которые ему предоставляет база данных. Проверка может занять довольно много времени (от нескольких сотен мс до нескольких секунд), поэтому для каждого элемента этот процесс необходимо разбить на отдельные потоки.
База данных вначале может давать ей 20 или 30 элементов в секунду, но это начинает быстро уменьшаться, в конечном итоге достигая около 65K элементов за 24 часа, после чего приложение закрывается.
Мне бы хотелось, чтобы кто-нибудь более знающий мог взглянуть на мой код и посмотреть, есть ли очевидные проблемы. Никто из тех, с кем я работаю, не знает многопоточности, так что я действительно один на этот раз.
Вот код. Это довольно долго, но должно быть довольно ясно. Дайте мне знать, если у вас есть какие-либо отзывы или советы. Спасибо!
public class ItemValidationService
{
/// <summary>
/// The object to lock on in this class, for multithreading purposes.
/// </summary>
private static object locker = new object();
/// <summary>Items that have been validated.</summary>
private HashSet<int> validatedItems;
/// <summary>Items that are currently being validated.</summary>
private HashSet<int> validatingItems;
/// <summary>Remove an item from the index if its links are bad.</summary>
/// <param name="id">The ID of the item.</param>
public void ValidateItem(int id)
{
lock (locker)
{
if
(
!this.validatedItems.Contains(id) &&
!this.validatingItems.Contains(id)
){
ThreadPool.QueueUserWorkItem(sender =>
{
this.Validate(id);
});
}
}
} // method
private void Validate(int itemId)
{
lock (locker)
{
this.validatingItems.Add(itemId);
}
// *********************************************
// Time-consuming routine to validate an item...
// *********************************************
lock (locker)
{
this.validatingItems.Remove(itemId);
this.validatedItems.Add(itemId);
}
} // method
} // class