私はC#アプリケーションを持っています。使用されるStackコレクションがあります。私は、TryPopからConcurrentStackに対して値を取得することを保証しますか
今、このコレクションは多くのスレッドからアクセスされているため、スレッドセーフにする必要があります。
ですから、私はConcurrentStack Collectionを代わりに使用したいと考えています。
これはTryPeek、TryPop、TryPushを使用し、成功/失敗を示すTrue/Falseフラグを返します。
このフラグは、オブジェクトがコレクション内に存在するかどうかを認識していますか?それとも、別のスレッドがコレクションに同時にアクセスしていて、アクションを再試行する必要があるために失敗する可能性があります。この方法は、false
アイテムを除去することができない場合/返却、又はTryPopCore
戻りfalse
を返し
public bool TryPop(out T result)
{
ConcurrentStack<T>.Node head = this.m_head;
if (head == null)
{
result = default(T);
return false;
}
if (Interlocked.CompareExchange<ConcurrentStack<T>.Node>(ref this.m_head, head.m_next, head) == head)
{
result = head.m_value;
return true;
}
return this.TryPopCore(out result);
}
:ここ
ドキュメントには、コレクションに削除して返すアイテムがない場合に 'false'が返されると記載されています。 – Amy
その確認のために@amyありがとうございました –
私はあなたがここで尋ねようとしているものが不明です。しかし、不確かな場合に備えて、これはマルチスレッド化されたアクセスだとすでに述べています。戻り値について何らかの*推論を行う*合理的*は、次回コレクションにアクセスしようとするときの状態に無関係*です。 –