0

スレッドとタスクを実行しています。 ReceiveThreadはネットワークから連続してデータを受信するスレッドで、 WriteTaskはReceiveThread が受信したデータをバッファに書き込むタスクです。高速データを受信して​​バッファに格納できるはずなので、それらは別々のスレッドにありますが、ライターは低速であり、間隔を置いてバッファからフェッチするだけです。

ReceiveThread と WriteTask は、ReaderWriterLockSlim を使用して読み取りおよび書き込みアクセス エラーを回避する共通のバッファーを共有します。たまたま、WriteTask の前に ReceiveThread を先に作成しましたが、近いうちに同じ型にする必要があります。WriteTask にブレークを設定すると、ReceiveThread も一時停止することに気付きました。これは、別のスレッド/タスクであると予想しているため、予想外でした。

スレッドとタスクであることが、2 つを別々のタスクとして扱わない要因であるかどうか疑問に思っています。

これはソースコード全体ではありませんが、どういうわけかアイデアはこのようなものです。

if (_receiveThread == null)
{
    _receiveThread = new Thread(new ThreadStart(ReceiveLoop));
    _receiveThread.Start();
}
if (_writeTask == null)
{
    _writeTask = Task.Factory.StartNew(WriteLoop);
}

private void ReceiveLoop()
{
     while (true)
     {
         data = ReceiveData();
         _rwLock.EnterReadLock();
         _buffer.Add(data)
         _rwLock.ExitReadLock();
     }
}

private void WriteLoop()
{
     while (true)
     {
         _rwLock.EnterWriteLock();
         WriteToFile(_buffer);
         _rwLock.ExitWriteLock();
     }
}
4

0 に答える 0