线程间通信会产生两个问题:一个是如何传递数据,另一个是如何同步。
1、线程间数据传递
线程被创建后,我们无法利用线程的控制函数将数据从一个线程传递到另一个线程,然而,.NET本身的一个重要特性就是完全面向对象,即所有的函数都是放在类之中,因此,如果我们改变类成员变量的值,这种改变将会被附着在类函数上的线程看到。
线程间通过资源(包括类成员变量)传递数据
例如:下面的例子使用队列在两个线程之间进行数据传递。
public class SMTPNotification
{
private Queue notificationQueue;
private string serverName;
private Thread sendingThread;
private SmtpClient client = new SmtpClient();
public SMTPNotification()
{
serverName = "";
client.Host = serverName;
notificationQueue = new Queue();
sendingThread = new Thread(new ThreadStart(NotificationMethod));
sendingThread.Start();
}
private void NotificationMethod()
{
while (true)
{
try
{
while (notificationQueue.Count > 0)
{
MailMessage message = (MailMessage)notificationQueue.Dequeue();
client.Send(message);
}
Thread.Sleep(1000);
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
}
}
}
public void SendNotification(string to, string from, string subject, string body)
{
MailMessage Message = new MailMessage();
Message.To.Add(to);
Message.From = new MailAddress(from);
Message.Subject = subject;
Message.Body = body;
notificationQueue.Enqueue(Message);
}
}
线程间数据传递会产生两个问题:
1)竞争
两个线程同时修改一个变量,后一个人的修改会覆盖前一个人的修改,这种情况叫做竞争。
2)死锁
当一个线程占用资源A而请求资源B,另一个线程占用资源B而请求资源A,两个线程都无法继续运行,这种情况叫做死锁。
2、线程间同步
线程间同步是指线程之间等待同步的过程。