我是线程新手,我是一名初级开发人员:)所以我猜测有很多错误。我的情况是这样的:我的线程设计是好还是不好?
- 看看数据库如果threre是DATAS女巫将sended采取这些DATAS
- 添加此DATAS到队列
- 如果队列不空出队下一mesaj,并将其发送
- 并等待10秒MSJ从另一个线程,
- 如果MSJ来到停下来等待,并传递给下一个MSG队列
- 如果MSJ didnt来尝试送等待它10秒2再次倍
- 如果仍然没有消息传递到下一个消息直到消息完成。
- 然后再次看向数据库中的MSG
我试图做到这一点是这样的:
private Thread ReceiveThread;
private Thread SendThread;
internal static Thread ServiceThread;
这3个线程
ReceiveThread = new Thread(ReceiveTask);
ReceiveThread.Start();
ServiceThread = new Thread(SerAutoThread.SendServiceMsg);
ServiceThread.Start();
SendThread = new Thread(SendTask);
SendThread.Start();
..
class SerAutoThread
{
internal static object[] NextService;
public static readonly object _locker = new object();
internal static Queue<object[]> Services;
internal static int sendingTime = 0;
private static DatabaseFirebird DB;
internal static void SendServiceMsg()
{
DB = new DatabaseFirebird();
DB.Open(ConnectionStr);
Services = new Queue<object[]>();
while (true)
{
if (Services.Count != 0)
{
SetNextSerAndSend();
}
else
{
CheckAndSetServices();
}
}
}
private static void SetNextSerAndSend()
{
NextService = Services.Dequeue();
for (int j = 0; j < 4; j++)
{
if (sendingTime == TRANSMITTED)
{
//pass to next msg
sendingTime = 0;
j = NEXTMSG;
}
else if (sendingTime < 3)
{
sendingTime++;
Byte[] data = SetNextPckage();
DeviceManager.MessageSendQueue.PostItem(new SendMessage("UDPCmd",
NextService[(int)NextMsg.DeviceId].ToString(),
data, data.Length));
MyDebug.WriteLine("Sended...");
lock (_locker)
{
Monitor.Wait(_locker, TimeSpan.FromSeconds(10));
}
}
else
{
// pass to next msg
j = NEXTMSG;
}
}
}
}
..
private void ReceiveTask()
{
ReceiveMessage receiveMsg;
while (true)
{
receiveMsg = Com.MessageReceiveQueue.GetItem(-1);
SerAutoThread.sendingTime
= SerAutoThread.TRANSMITTED;
lock (SerAutoThread._locker)
{
Monitor.Pulse(SerAutoThread._locker);
}
}
}
...
private void SendTask()
{
SendMessage msg;
while (true)
{
msg = MessageSendQueue.GetItem(-1);
String rtrn = PushData(msg);
}
}
是线程安全与否。我不确定设计是否有问题,或者我在别处做错了什么? 谢谢...
您可以看看TPL,Reactive Extensions或TPL-Dataflow。在那里你可以找到安全的方法。考虑异常处理等。看看这些库,并使用它们来解决您的问题。 – embee
我认为这属于更多的http://codereview.stackexchange.com/? – Jordy