여기 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 4는 Jon Skeet이 대답했다. 신용은 그를 지적하기 위해 그에게갑니다. 고마워, 존. 나는 그 수업을 아직 사용할 이유가 없었고 사용하기가 얼마나 쉬운지를 보았을 때 즐겁게 놀랐다.
이 클래스를 사용하면 얻을 수있는 성능상의 이점 외에도 Task<TResult>
클래스를 사용하여 동일한 코드를 작성하는 것이 훨씬 쉬워 진 것 같습니다. 예를 들어, 위와 같이 다시 작성할 수 Main 메서드의 본문은 다음과 같습니다 : 당신이 작업에 대한 시간 제한을 지정할 필요가 없으며 무기한 대기하는 내용 인 경우가 끝날 때까지
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);
두 스레드가 동시에 시작합니까? 수신자가 발신자를 기다리는 동안 수행하는 작업은 무엇입니까? Sender는 임의의 숫자를 생성 한 후 무엇을합니까? – cadrell0
IS this is .NET 4? – Yahia
주 기능에서 두 스레드를 모두 시작하고 스레드 송신기가 작동하고 3 초 동안 대기합니다. 또한 데이터를 수신 할 스레드 수신자의 인스턴스를 시작합니다 ...basiclly 쓰레드는 사용자가 누를 때마다 esc 키를 누른다. reciever ll은받은 콘솔 번호에 글을 쓴다. – Avicena00