Я все еще изучаю Threading, и у меня есть проблемы с этим кодом ниже. Извините, если этот вопрос появился раньше, я просто не понимаю, почему этот код не работает. Я упростил код:
static EventWaitHandle waitH; // AutoResetEvent, wait for signal
static bool whExit; // signal to exit waiting
static Queue<string> str; // waiting line (example values)
static Queue<int> num; //
static void Main(string[] args)
{
waitH = new AutoResetEvent(false); // initialize waiter
str = new Queue<string>();
num = new Queue<int>();
Thread thr = new Thread(new ThreadStart(Waiter)); // waiting in another thread
thr.Start(); // start the waiting thread
for(short i = 0; i < 10; i++)
{
str.Enqueue(string.Format($"{(char)(i + 65)}")); // add something to queue
num.Enqueue(i); // add a number to test incrementing
waitH.Set(); // signal to start the "long processing"
}
}
static void Waiter()
{
while(!whExit)
{
waitH.WaitOne(); // wait for signal
WriteToConsole(); // start the long processing on another thread
}
}
static void WriteToConsole()
{
// threadstart with parameters
// action: void delegate
// get 2 values from waiting line
var f = new ParameterizedThreadStart(obj =>
new Action<string, int>(ConsoleWriter)
(str.Dequeue(), num.Dequeue())); // it's thread safe, because FIFO?
Thread thr = new Thread(f);
thr.IsBackground = true; // close thread when finished
thr.Start();
}
// print to console
static void ConsoleWriter(string s, int n)
{
Console.WriteLine(string.Format($"{s}: {++n}")); // easy example
}
Останавливается в главном l oop. Я думаю, что проблема в том, что Thread.Start () вызывается первым, но ему нужно изменить состояние потока и присоединиться к очереди «необходимо обработать», что требует времени. L oop Main работает уже и не ожидает сигнала.
Я решил эту проблему с помощью двусторонней сигнализации: использовал другой сигнал паузы AutoResetEvent после waitH.Set () в l oop ( WaitOne) и подать сигнал после завершения Console.WriteLine ().
Я не очень горжусь этим решением, потому что если я это сделаю, программа теряет "threadi sh", параллельный или синхронный подходить. И это пример, я хотел бы запускать длинные вычисления одновременно в разных потоках.
Если я увижу вывод, это пример для книги, который я делаю неправильно:
Вывод: A: 1 B: 2 Иногда B: 2 A: 1
Ожидаемый вывод: A: 1 B: 2 C: 3 D: 4 E: 5 F: 6 G: 7 H: 8 I: 9 J: 10
Есть ли какой-нибудь элегантный способ решить эту проблему? Может быть, использовать замки и т. Д. c.
Любое обсуждение будет приветствоваться. Спасибо!