ここにコードの要点を示します。間違いなく変更を加える必要があります。それが役に立てば幸い。
private static Queue<Dictionary<string, string>> messages;
....
{
...
AutoResetEvent ev = new AutoResetEvent(false);
...
Dictionary<string, string> msg1 = new Dictionary<string, string>();
msg1.Add("Id", "1");
msg1.Add("Fetch", "Song1");
Dictionary<string, string> msg2 = new Dictionary<string, string>();
msg2.Add("Id", "2");
msg2.Add("Fetch", "Song2");
messages.Enqueue(msg1);
messages.Enqueue(msg2);
ThreadPool.RegisterWaitForSingleObject(
ev,
new WaitOrTimerCallback(WaitProc),
messages,
5000,
false
);
// The main thread waits 10 seconds, to demonstrate the
// time-outs on the queued thread, and then signals.
Thread.Sleep(10000);
...
}
private static void WaitProc(object state, bool timedOut)
{
// The state object must be cast to the correct type, because the
// signature of the WaitOrTimerCallback delegate specifies type
// Object.
Queue<Dictionary<string, string>> dict = (Queue<Dictionary<string, string>>)state;
string cause = "TIMED OUT";
if (!timedOut)
{
cause = "SIGNALED";
//signaled to return. return without doing any work
return;
}
// timed out. now do the work
Dictionary<string, string> s1 = dict.Dequeue();
}
`
私の質問に答えるための完全なコード例を提供する必要はありません。 ThreadPool.RegisterWaitForSingleObjectメソッド呼び出しの提案で十分です。とにかくありがとう。 – ajmccall
@ajmccall、私は誤解している必要があります。以前のレスポンスで 'ThreadPool.RegisterWaitForSingleObject'と言いましたので、追加の詳細を探していると思いました。とにかく、これが助けてくれてうれしいです。 –
私はこの答えはスレッドセーフではないと思います。 Queueオブジェクトはスレッド間で共有されていますが、ドキュメントではキューのインスタンスが自動的にスレッドセーフではないことが示されています。http://msdn.microsoft.com/en-us/library/system.collections.queue.aspxこの実装この場合、ハンドラは5秒以上何度も待機し続けるため、ハンドラは柔軟性があり、すべてのメッセージが処理される前に正確に同じ時間待機する必要はありません。 – satur9nine