我是線程新手,我是一名初級開發人員:)所以我猜測有很多錯誤。我的情況是這樣的:我的線程設計是好還是不好?
- 看看數據庫如果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