您可以使用BlockingCollection(T) 在线程之间进行通信。将这些步骤建模为状态机,您可以在线程之间对消息进行 ping-pong。
// States
public enum MessageType
{
Done,
Work1,
Work2,
Work3,
Work4
}
// Data
public class WorkerStateMessage
{
public static readonly WorkerStateMessage Done =
new WorkerStateMessage { Type = MessageType.Done };
public MessageType Type { get; set; }
public string Progress { get; set; }
public int Data { get; set; }
}
主要
static Thread thread1 = new Thread(new ThreadStart(Team1Shots));
static Thread thread2 = new Thread(new ThreadStart(Team2Shots));
static BlockingCollection<WorkerStateMessage> thread1Messages =
new BlockingCollection<WorkerStateMessage>();
static BlockingCollection<WorkerStateMessage> thread2Messages =
new BlockingCollection<WorkerStateMessage>();
static BlockingCollection<WorkerStateMessage> progressMessages =
new BlockingCollection<WorkerStateMessage>();
static void Main(string[] args)
{
thread1Messages.Add(new WorkerStateMessage { Type = MessageType.Work1, Data = 1 });
thread1Messages.Add(new WorkerStateMessage { Type = MessageType.Work1, Data = 2 });
thread1Messages.Add(new WorkerStateMessage { Type = MessageType.Work1, Data = 3 });
thread1.Start();
thread2.Start();
// 4 step * 3 messages = 12 progress messages
foreach(var message in progressMessages.GetConsumingEnumerable().Take(12))
{
Console.WriteLine(message.Progress);
Console.WriteLine("Current data: {0}", message.Data);
}
thread1Messages.Add(WorkerStateMessage.Done);
thread2Messages.Add(WorkerStateMessage.Done);
thread1.Join();
thread2.Join();
}
线程 1
private static void Team1Shots()
{
foreach(var message in thread1Messages.GetConsumingEnumerable())
{
WorkerStateMessage nextMessage;
switch(message.Type)
{
case MessageType.Work1:
var added = message.Data + 1;
nextMessage = new WorkerStateMessage
{
Type = MessageType.Work2,
Progress = "Add 1",
Data = added
};
progressMessages.Add(nextMessage);
thread2Messages.Add(nextMessage);
break;
case MessageType.Work3:
var multiplied = message.Data + 1;
nextMessage = new WorkerStateMessage
{
Type = MessageType.Work4,
Progress = "Multiply by 2",
Data = multiplied
};
progressMessages.Add(nextMessage);
thread2Messages.Add(nextMessage);
break;
default:
return;
}
}
}
线程 2
private static void Team2Shots()
{
foreach(var message in thread2Messages.GetConsumingEnumerable())
{
WorkerStateMessage nextMessage;
switch(message.Type)
{
case MessageType.Work2:
var added = message.Data + 2;
nextMessage = new WorkerStateMessage
{
Type = MessageType.Work3,
Progress = "Add 2",
Data = added
};
progressMessages.Add(nextMessage);
thread1Messages.Add(nextMessage);
break;
case MessageType.Work4:
var divided = message.Data / 2;
nextMessage = new WorkerStateMessage
{
Type = MessageType.Work3,
Progress = "Divide by 2",
Data = divided
};
progressMessages.Add(nextMessage);
thread2Messages.Add(nextMessage);
break;
default:
return;
}
}
}
输出
Add 1
Current data: 2
Add 1
Current data: 3
Add 1
Current data: 4
Add 2
Current data: 4
Add 2
Current data: 5
Add 2
Current data: 6
Multiply by 2
Current data: 5
Multiply by 2
Current data: 6
Multiply by 2
Current data: 7
Divide by 2
Current data: 2
Divide by 2
Current data: 3
Divide by 2
Current data: 3