製品をドロップダウンして、製品を選択してwebsocketに接続し、その製品のフィードメッセージを取得します。 (1)フィードメッセージが来たら、(2)注文書を入手してから、(3)フィードメッセージを処理する必要があります。したがって、最初と最後のタスクは非同期に実行されます。このために私は次のコードを書いています:マルチスレッドで正しくデータが処理されない
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
}
}
}
これは初めて完全に動作します。しかし、製品を交換して再接続すると、データが正しく処理されず、データが正しく処理されません。製品に書かれたコードは、私がロックまたはasync /待つか、何か他のものを使用する必要があるかどうかわからないので、マルチスレッドに新しいです
private void CloseAndReconnectToGetWebsocketFeed()
{
w.CloseWebsocketConnection();
messageStreamStarted = false;
isOrderBookUpdated = false;
ConcurrentQueue<string> wssMessagesQueue = new ConcurrentQueue<string>();
concurrentQueue = wssMessagesQueue;
ConnectAndGetWebsocketFeedMessages(); // this calls OnReceivingFeedMessage
}
を変更するのselectedIndex。上記のコードで何が間違っていますか?
初めて実行したときに正常に動作していますが、製品を変更して同じ処理を再度行うと問題が発生します。誰かが何度も同じ手順を繰り返す前にすべてのリソースをクリアする方法をアドバイスできますか?
非常に不必要に複雑なコードがあるようです。メッセージが届くとすぐに(並行して)簡単に処理したいと思っていますか? – georch
新しいメッセージが入ってくるとすぐに古いメッセージの処理を中止しますか? – georch
いいえ、私はメッセージが来るとすぐに注文簿を取得したいし、一度私は注文書を取得し、私はメッセージを処理する必要があります。したがって、最初のメッセージが来て本を注文してから処理します – user1254053