İşte waitHandle kullanarak olası bir yaklaşım:
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);
}
}
Sadece içinde
Task<TResult>
sınıfını kullanarak yukarıdaki örneğe eşdeğer kod olduğunu düşünüyorum sağlamak için benim cevap güncellemek istedim. NET 4, Jon Skeet tarafından cevabında belirtti. Kredi ona işaret ettiği için ona gider. Çok sağol Jon. Henüz bu sınıfı kullanmak için bir nedenim olmadı ve ne kadar kolay kullanıldığını gördüğümde hoş bir sürpriz oldu.
Bu sınıfın kullanılmasıyla kaputun altında kazandığınız performans avantajlarının yanı sıra, Task<TResult>
sınıfını kullanarak eşdeğer kod yazmak çok daha kolay görünüyor. Örneğin, yukarıdaki şekilde tekrar yazılabilir Ana yöntemin vücut aşağıda gösterilen: Eğer görev için bir zaman aşımı belirtmek gerek var ve sonsuza kadar beklemek içerik varsa bunu bitirmek için
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");
}
, o zaman yazabilirsiniz Bu kullanarak daha az kod: iki iş parçacığı arasında iletişimi sağlamak için
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);
Her iki iş parçacığı aynı anda başlatılıyor mu? Gönderici beklerken alıcı ne yapıyor? Gönderen, rastgele bir sayı oluşturduktan sonra ne yapar? – cadrell0
Bu .NET 4 IS? – Yahia
Ana işlevde her iki başlığa da başlayacağım ve iş parçacığı işleyicisi çalışacak ve ardından 3 saniye uyuyacağım. Ayrıca veriyi alacağım ...basiclly thread 'll work kullanıcısı olmayan esc tuşuna basın ... reciever ll alınan konsol numaralarına yazınız. – Avicena00