Я использую пул потоков (что неудивительно) для управления набором потоков.То, что я пытаюсь сделать, это заставить их сигнализировать, когда это будет сделано, у меня есть:
ManualResetEvent[] doneEvents = new ManualResetEvent[char_set.Length];
public struct string_char
{
public string[] _str_char;
public ManualResetEvent _doneEvent;
public string_char(string[] str_char, ManualResetEvent doneEvent)
{
_str_char = str_char;
_doneEvent = doneEvent;
}
}
У меня есть цикл, который создает массив char, а затем я создаю экземпляр моей структуры, заполняющей массив charи событие done:
doneEvents[no_of_elements - 1] = new ManualResetEvent(false);
string_char s_c = new string_char(array_holder, doneEvents[no_of_elements - 1]);
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, s_c);
Итак, поток создается, добавляется в пул, и он весело выключается и запускается, после завершения он устанавливает событие done:
public void ThreadPoolCallback(Object s_c)
{
string_char _s_c = (string_char)s_c;
//do the calculations...
//when done:
_s_c._doneEvent.Set();
}
Возвращаясь к главному циклу, код ждет здесь:
WaitHandle.WaitAll(doneEvents);
Console.WriteLine("All calculations are complete.");
Проблема в том, что я получаю исключение:
'WaitAll for multiple handles on a STA thread is not supported.'
Я посмотрел это в Google, но это не такне очень помогает, что я делаю не так.Это в основном повторение примера ms msdn, кроме того, что я использую структуру, а не класс?
Я исправил проблему, используя приведенный ниже совет, переключившись на MTA (doh!) В основном;Также было полезно узнать, что максимальное число потоков составляет 64.Поэтому мне придется переключиться на другую модель ожидания, так как в конечном приложении будет запущено несколько больше!Много учиться.
Спасибо.