У меня проблема с моим тестовым приложением.Я запускаю приложение win form, которое может публиковать запросы в веб-сервисе.Есть таймер, который периодически добавляет элементы в очередь запросов.У меня есть класс AutoManager, который используется для выбора элементов из очереди и отправки их в веб-службу.
В TryKickQueue () он добавляет IAutoProcessor в очередь пула потоков.Когда IAutoProcessor завершается, он обращается к AutoManager, чтобы удалить себя из очереди.
Это работает нормально и без проблем запускает первые 10 запросов, однако по какой-то причине я не могу понять, что 10-й поток никогда не заканчиваетсяи так застревает.Это странно, потому что это всегда 10-е.Я делаю что-то не так, мне нужно что-то убирать?
Должно ли это случиться или это тупик, который я не смог найти?
Большое спасибо, Нил
public AutoManager(Settings _settings, Log _log)
{
m_sessionKicker = new BackgroundWorker();
m_sessionKicker.DoWork += SessionKickerDoWork;
m_sessionKicker.RunWorkerCompleted += SessionKickerRunCompleted;
m_sessionKicker.WorkerSupportsCancellation = true;
m_sessionKicker.RunWorkerAsync();
m_processorQueue = new List<IAutoProcessor>();
m_inProcessingQueue = new List<IAutoProcessor>();
}
private void SessionKickerDoWork(object sender, DoWorkEventArgs e)
{
bool bFinished = false;
while (!bFinished)
{
TryKickQueue();
}
}
private void TryKickQueue()
{
object thisObject = new Object();
lock (thisObject)
{
if (m_processorQueue.Count > 0 && m_inProcessingQueue.Count < m_settings.MaxThreads)
{
IAutoProcessor proc = m_processorQueue[0];
m_inProcessingQueue.Add(proc);
m_processorQueue.RemoveAt(0);
if (proc != null)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(proc.SendData));
}
}
}
}
public void OnRemoveAutoProcessor(IAutoProcessor _autoProcessor)
{
object thisObject = new Object();
lock (thisObject)
{
m_inProcessingQueue.Remove(_autoProcessor);
}
}