私はキューに物事を置くために私の紺色のコードにスレッドをencorperatingに取り組んでいました。これを行うには私は参考としてhttp://www.microsoft.com/download/en/details.aspx?id=19222を使用しました。Task.Wait in ContinueWhenAllアクション
public void AddMessagesAsync(IEnumerable<IQueueMessage> messages, string queue = null, TimeSpan? timeToLive = null)
{
//check if we need to switch queues
if (!String.IsNullOrEmpty(queue))
{
SetCurrent(queue);
}
//setup list of messages to enqueue
var tasks = new List<Task>();
Parallel.ForEach(messages, current => {
if (timeToLive.HasValue)
{
//create task with TPL
var task = Task.Factory.FromAsync(Current.BeginAddMessage, Current.EndAddMessage, Convert(current), timeToLive.Value, tasks);
//setup continuation to trigger eventhandler
tasks.Add(task.ContinueWith((t) => AddMessageCompleted(t)));
}
else
{
//create task with TPL
var task = Task.Factory.FromAsync(Current.BeginAddMessage, Current.EndAddMessage, Convert(current), tasks);
//setup continuation to trigger eventhandler
tasks.Add(task.ContinueWith((t) => AddMessageCompleted(t)));
}
});
//setup handler to trigger when all messages are enqueued, a we are blocking the thread over there to wait for all the threads to complete
Task.Factory.ContinueWhenAll(tasks.ToArray(), (t) => AddMessagesCompleted(t));
}
private void AddMessagesCompleted(Task[] tasks)
{
try
{
//wait for all tasks to complete
Task.WaitAll(tasks);
}
catch (AggregateException e)
{
//log the exception
var ex = e;
//return ex;
}
if (AddedMessages != null)
{
AddedMessages(tasks, EventArgs.Empty);
}
}
今、私の質問は、(MSが提供するドキュメントに応じている)継続中Task.Waitについてです:複数のメッセージをエンキューする
私のコードは次のようになります。あなたが既に正しく完了したことを知っているスレッドを待つのは少し奇妙なようです。私が想像できる唯一の理由は、エラーをバブルして処理することです。ここに何かがないのですか?
私は私の前提に同意すると思いますか? –
@Didierええ - 私の答えでその部分を忘れてください:) – Skomski