2

ID をキーとして、キューを値として含む辞書を使用しています。1 つのスレッドがキューに書き込み、別のスレッドがキューから読み取るため、.NET 4.0 で導入された同時実行構造を使用する必要があります。この一環として、キューを埋めるためだけにテスト アプリケーションを作成しようとしましたが、約 10 秒後にタイマーが停止するという問題に遭遇しました。キャッチするもの、エラーメッセージ、または何が間違っているのかについてのヒントを与えるものがないため、その理由が本当にわかりません。

タイマーが約 10 秒後に停止する理由を誰かが説明してくれませんか? これを 2 台の異なるコンピューターで試しました (どちらも Visual Studio 2012 を使用していますが、.NET Framework 4.0 を使用しています)。

class Program {

    private readonly ConcurrentDictionary<int, ConcurrentQueue<TestObject>> _pipes = 
        new ConcurrentDictionary<int, ConcurrentQueue<TestObject>>();

    static void Main() {
        Program program = new Program();
        program.Run();
        Console.Read();
    }

    private void Run() {
        _pipes[100] = new ConcurrentQueue<TestObject>();
        _pipes[200] = new ConcurrentQueue<TestObject>();
        _pipes[300] = new ConcurrentQueue<TestObject>();

        Timer timer = new Timer(WriteStuff, null, 0, 100);
    }

    private void WriteStuff(object sender) {
        for (int i = 0; i < 5; i++) {
            foreach (KeyValuePair<int, ConcurrentQueue<TestObject>> pipe in _pipes) {
                pipe.Value.Enqueue(
                    new TestObject { Name = DateTime.Now.ToString("o") + "-" + i });
            }
            i++;
        }
        Console.WriteLine(DateTime.Now + "added stuff");
    }
}

internal class TestObject {
    public string Name { get; set; }
    public bool Sent { get; set; }
}
4

1 に答える 1

4

最も可能性が高いのは、タイマーが範囲外になり、収集されていることです。外部スコープでタイマーを宣言します。あれは:

private Timer timer;
private void Run()
{
    ...
    timer = new Timer(WriteStuff, null, 0, 100);
}

BlockingCollectionまた、よりも の方が扱いやすいことがわかると思いますConcurrentQueueBlockingCollection並行コレクションの周りに非常に優れた API をラップし、物事を削除するときにキューでビジーでない待機を簡単に実行できるようにします。デフォルトの構成ではConcurrentQueue、バッキング ストアとして を使用します。それを使用するにはConcurrentQueue、コードを に置き換え、呼び出しから呼び出しにBlockingCollection変更するだけです。次のように:EnqueueAdd

for (int i = 0; i < 5; i++)
{
    foreach (var pipe in _pipes)
    {
        pipe.Value.Add(
            new TestObject { Name = DateTime.Now.ToString("o") + "-" + i });
    }
}
于 2013-03-18T16:48:48.497 に答える