下面是一个使用WaitHandle的一种可能的方法:
class Program
{
static void Main(string[] args)
{
Sender _sender = new Sender();
Receiver _receiver = new Receiver();
using (ManualResetEvent waitHandle = new ManualResetEvent(false))
{
// have to initialize this variable, otherwise the compiler complains when it is used later
int randomNumber = 0;
Thread thread1 = new Thread(new ThreadStart(() =>
{
randomNumber = _sender.GenerateNumber();
try
{
// now that we have the random number, signal the wait handle
waitHandle.Set();
}
catch (ObjectDisposedException)
{
// this exception will be thrown if the timeout elapses on the call to waitHandle.WaitOne
}
}));
// begin receiving the random number
thread1.Start();
// wait for the random number
if (waitHandle.WaitOne(/*optionally pass in a timeout value*/))
{
_receiver.TakeRandomNumber(randomNumber);
}
else
{
// signal was never received
// Note, this code will only execute if a timeout value is specified
System.Console.WriteLine("Timeout");
}
}
}
}
public class Sender
{
public int GenerateNumber()
{
Thread.Sleep(2000);
// http://xkcd.com/221/
int randomNumber = 4; // chosen by fair dice role
return randomNumber;
}
}
public class Receiver
{
public void TakeRandomNumber(int randomNumber)
{
// do something
System.Console.WriteLine("Received random number: {0}", randomNumber);
}
}
我只是想更新我的答案提供什么,我认为是使用在
Task<TResult>
类上面例子中的等价代码。 NET S 4在Jon Skeet的回答中指出。信用归功于他指出。谢谢,Jon。我还没有理由使用该课程,并且当我看到使用这个课程有多容易时,我感到非常惊喜。
除了使用该课程获得的性能优势之外,使用Task<TResult>
类编写等效代码似乎更容易。例如,如下所示的主要方法上面可以改写为体:
Sender _sender = new Sender();
Receiver _receiver = new Receiver();
Task<int> getRandomNumber = Task.Factory.StartNew<int>(_sender.GenerateNumber);
// begin receiving the random number
getRandomNumber.Start();
// ... perform other tasks
// wait for up to 5 seconds for the getRandomNumber task to complete
if (getRandomNumber.Wait(5000))
{
_receiver.TakeRandomNumber(getRandomNumber.Result);
}
else
{
// the getRandomNumber task did not complete within the specified timeout
System.Console.WriteLine("Timeout");
}
如果你没有必要指定任务超时,且内容无限期地等待它完成,然后你可以写这使用更少的代码:
Sender _sender = new Sender();
Receiver _receiver = new Receiver();
Task<int> getRandomNumber = Task.Factory.StartNew<int>(_sender.GenerateNumber);
// begin receiving the random number
getRandomNumber.Start();
// ... perform other tasks
// accessing the Result property implicitly waits for the task to complete
_receiver.TakeRandomNumber(getRandomNumber.Result);
两个线程是否同时启动? Receiver在等待发件人时正在做什么?发件人在生成随机数后会做些什么? – cadrell0 2012-01-06 20:06:34
这是.NET 4吗? – Yahia 2012-01-06 20:12:23
在主函数中,我将启动这两个线程,线程发送程序将工作,然后休眠3秒钟。另外,我将开始接收数据的线程接收器的实例...basiclly线程将工作untui用户按esc键...接收器将写入收到的控制台号码。 – Avicena00 2012-01-06 20:12:43