我知道C#,但我很难理解一些基本的(我认为)概念,比如信号。
我花了一些时间寻找一些例子,即使在这里也没有运气。 也许一些例子或一个真实的简单场景可以很好地理解它。
答案 0 :(得分:23)
这是一个为您定制的控制台应用程序示例。实际上并不是一个好的现实场景,但线程信令的使用就在那里。
using System;
using System.Threading;
class Program
{
static void Main()
{
bool isCompleted = false;
int diceRollResult = 0;
// AutoResetEvent is one type of the WaitHandle that you can use for signaling purpose.
AutoResetEvent waitHandle = new AutoResetEvent(false);
Thread thread = new Thread(delegate() {
Random random = new Random();
int numberOfTimesToLoop = random.Next(1, 10);
for (int i = 0; i < numberOfTimesToLoop - 1; i++) {
diceRollResult = random.Next(1, 6);
// Signal the waiting thread so that it knows the result is ready.
waitHandle.Set();
// Sleep so that the waiting thread have enough time to get the result properly - no race condition.
Thread.Sleep(1000);
}
diceRollResult = random.Next(1, 6);
isCompleted = true;
// Signal the waiting thread so that it knows the result is ready.
waitHandle.Set();
});
thread.Start();
while (!isCompleted) {
// Wait for signal from the dice rolling thread.
waitHandle.WaitOne();
Console.WriteLine("Dice roll result: {0}", diceRollResult);
}
Console.Write("Dice roll completed. Press any key to quit...");
Console.ReadKey(true);
}
}
答案 1 :(得分:6)
简而言之,这就是一种方式。
unpackDataFromFile(filename)
--- false表示如果调用waitHandle.WaitOne(),那么等待句柄是无信号的,它将停止该线程。
您要等待其他事件完成添加的主题
AutoResetEvent waitHandle = new AutoResetEvent(false);
在需要完成的线程中,在完成添加时结束
waitHandle.WaitOne();
waitHandle.Set();
等待信号
waitHandle.WaitOne();
表示完成。
答案 2 :(得分:3)
对我来说,给你明确的指示是一个非常大的领域。
为了理解信号等概念,Thread Synchronization上的这个链接将是一个很好的起点。它也有例子。然后,您可以根据您尝试执行的操作深入查看特定的.net类型。在进程内的线程之间或跨进程等之间发出信号。