1

以下のような BlockingCollection を使用しようとしていますが、それがスレッド セーフなどに適していることを確認したかっただけです。何かに CancellationTokenSource が必要かどうか疑問に思っていました。

ありがとう

public class MyApp
{
  private BlockingCollection<int> blockingCollection;

  public void Start()
  {
     blockingCollection= new BlockingCollection<int>();
     var task = Task.Factory.StartNew(ProcessData);
  }

  public void Add(int value)
  {
    blockingCollection.Add(value); //This is a thread that receives input
  }

  private void ProcessData()
  {
    foreach(var item in blockingCollection.GetConsumingEnumerable())
    {  
      ...
    }
  }

  public void Finish()
  {
    blockingCollection.CompleteAdding();
  }
}
4

2 に答える 2

2

明らかに、キャンセル トークンを使用して、コードで適切なキャンセル パターンをサポートできます。

  private readonly CancellationTokenSource cts = new CancellationTokenSource();

  public void Start()
  {
     blockingCollection= new BlockingCollection<int>();
     var task = Task.Factory.StartNew(ProcessData, cts.Token);
  }

  private void ProcessData()
  {
    foreach(var item in blockingCollection.GetConsumingEnumerable(cts.Token))
    {  
        cts.Token.ThrowIfCancellationRequested();

        // ...
    }
  }

  public void Cancel()
  {
      cts.Cancel();
  }
于 2012-09-26T12:54:16.513 に答える
2

はい、BlockingCollectionそれ自体はスレッドセーフです。MSDN から:

IProducerConsumerCollection は、スレッドセーフなデータの追加と削除を可能にするコレクションを表します。BlockingCollection は IProducerConsumerCollection インスタンスのラッパーとして使用され、データを削除できるようになるまで、コレクションからの削除の試行をブロックできます。

わかりました、これはそれを使用する実際のコードについてはあまり言いませんが、コードで見たところ、正しく使用されています。

于 2012-09-26T12:56:59.023 に答える