Ich habe ein Dropdown-Produkt und die Auswahl des Produkts verbindet sich mit einem Websocket und erhalten Sie die Feed-Nachrichten für dieses Produkt. Sobald die (1) Feed-Nachrichten kommen, muss ich dann (2) das Auftragsbuch bekommen und dann (3) die Feed-Nachrichten verarbeiten. Die erste und die letzte Aufgabe würden also asynchron ausgeführt werden. Dazu habe ich folgenden Code geschrieben:C# Daten verarbeiten nicht korrekt in Multithreading
void OnReceivingFeedMessage()
{
concurrentQueue.Enqueue(message);
if (!messageStreamStarted) // only first time get order book
{
messageStreamStarted = true;
GetOrderBookData();
}
}
private void GetOrderBookData()
{
MarketData m = new MarketData();
ProductOrderBook p = m.GetProductOrderBook(productId);
bidsList = p.bids;
asksList = p.asks;
isOrderBookUpdated = true;
Task task3 = Task.Run(() => KickStartToProcessQueue());
}
private void KickStartToProcessQueue()
{
while (threadProcessQueueExist)
{
int recordCountNew = concurrentQueue.Count();
if (recordCountNew != 0)
{
if (isOrderBookUpdated)
{
ProcessQueueMessages();
}
}
}
}
private void ProcessQueueMessages()
{
if (!concurrentQueue.IsEmpty)
{
string jsonString;
while (concurrentQueue.TryDequeue(out jsonString))
{
// have to insert the record in existing order book
}
}
}
Das funktioniert perfekt zum ersten Mal. Aber wenn ich das Produkt ändere und die Dinge wieder verbinde, werden die Daten nicht richtig verarbeitet. Der Code auf Produkt geschrieben selectedIndex
private void CloseAndReconnectToGetWebsocketFeed()
{
w.CloseWebsocketConnection();
messageStreamStarted = false;
isOrderBookUpdated = false;
ConcurrentQueue<string> wssMessagesQueue = new ConcurrentQueue<string>();
concurrentQueue = wssMessagesQueue;
ConnectAndGetWebsocketFeedMessages(); // this calls OnReceivingFeedMessage
}
: Ich bin so ändern, nicht sicher Multi-Threading, wenn wir sperren oder Asynchron verwenden müssen,/erwarten oder etwas anderes. Was mache ich falsch im obigen Code?
Es läuft gut, wenn Sie das erste Mal laufen, aber in dem Moment, in dem ich das Produkt ändere und die gleiche Verarbeitung wieder mache, gibt es Probleme. Kann jemand bitte beraten, wie kann ich alle Ressourcen löschen, bevor Sie die gleichen Schritte immer wieder tun
Sie scheinen sehr unnötigen komplizierten Code zu haben. Verstehe ich Sie richtig, dass Sie die Nachrichten (parallel) einfach verarbeiten möchten, sobald sie eingehen? – georch
Und Sie möchten die alten Nachrichten abbrechen, sobald neue Nachrichten eintreffen? – georch
Nein, ich möchte das Auftragsbuch bekommen, sobald die Nachrichten kommen und dann, wenn ich das Auftragsbuch bekommen habe, muss ich die Nachrichten verarbeiten. So werden die ersten Nachrichten kommen dann bestellen und dann Verarbeitung – user1254053