7

1つのプロデューサースレッドと複数のコンシューマースレッドを持つ次のコードがあります。複数のコンシューマーがスレッドセーフかどうか知っていますか。たとえば、スレッド1が消費している可能性がありますが、そのスレッド2は並行して消費し、スレッド1で使用されているアイテムの値を変更しますか?

namespace BlockingColl
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            for (int i = 0; i < 3; i++)
            {

                ThreadPool.QueueUserWorkItem((x) =>
                   {
                       foreach (var item in bc.GetConsumingEnumerable())
                       {
                           Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " - " + item + " - " + DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
                       }
                   });
            }
        }
        catch (Exception)
        {

            throw;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 3; i++)
        {

            ThreadPool.QueueUserWorkItem((x) =>
               {
                   Cache.Consume();
               });
        }


        for (int i = 0; i < 50000; i++)
        {
            Cache.bc.TryAdd(new Client() { ClientId = i, ClientName = "Name" + i });
        }
    }
}

static class Cache
{
    public static BlockingCollection<Client> bc = new BlockingCollection<Client>();


    public static void Consume()
    {
        foreach (var item in bc.GetConsumingEnumerable())
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " - " + item + " - " + DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
        }
    }
}

public class Client
{
    public int ClientId { get; set; }
    public string ClientName { get; set; }
}
}

前もって感謝します

4

2 に答える 2

1

要素を消費すると、その要素はコレクションから削除されるため、他のスレッドは(少なくともコレクションを介して)その要素にアクセスできなくなります。

そのキャッシュは、私にはバッファのように見えます。とにかく、ブロッキングコレクションの上に何を追加しますか?キャッシュが独自の要素を消費できるのは奇妙なことです。

于 2012-11-02T14:11:46.243 に答える
0

BlockingCollectionは、コレクション自体のみをブロックします。リスト内のオブジェクトではありません。

于 2012-11-02T13:41:14.037 に答える