gpt4 book ai didi

c# - ContinueWhenAll 操作中的 Task.Wait

转载 作者:太空狗 更新时间:2023-10-29 23:10:23 25 4
gpt4 key购买 nike

我正在致力于将线程合并到我的 azure 代码中,以便将事物放入队列中。为此,我使用了 http://www.microsoft.com/download/en/details.aspx?id=19222作为引用。

我的将多条消息排入队列的代码如下所示:

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);
}
}

现在我的问题是关于延续中的Task.Wait(这是根据MS提供的文档)。等待您已经知道已经完成的线程似乎有点奇怪,对吧?我能想象的唯一原因是冒泡错误并处理这些错误。我在这里遗漏了什么吗?

最佳答案

Task.WaitAll()会抛出 AggregateException当至少一个任务实例被取消时 - 或者 - 在至少一个任务实例执行期间抛出异常。

ContinueWhenAll()不会抛出此异常,它只是在一切完成取消或未完成等时启动您的最后一个任务。

关于c# - ContinueWhenAll 操作中的 Task.Wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7007685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com