gpt4 book ai didi

c# - 在 BlockingCollection 中处理异常

转载 作者:行者123 更新时间:2023-11-30 17:34:04 25 4
gpt4 key购买 nike

我有一个用于处理队列(即发送电子邮件)的阻塞 BlockingCollection

BlockingCollection<ItemQueue> queue = new BlockingCollection<ItemQueue>();
Thread threadQueue = new Thread(ProcessQueue);
threadQueue.Start();

private void ProcessQueue()
{
while (true)
{
var item = queue.Take();

process(item);
}
}

public void process(ItemQueue item)
{
try
{
// do something
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}

基本上我运行一个单独的线程,等待队列中的一个元素(某处有 Add() 调用)。然后我处理那个项目。此函数可能会引发异常:例如,如果我们正在谈论电子邮件,Send() 可能会失败。

我想根据具体应用以两种不同的方式处理这种情况:

  1. 对同一项目重复处理函数,直到无一异常(exception)地完成
  2. 将此项目放在队列末尾以便稍后重试,但现在处理其他项目

是否有更好的方法来原生处理这些行为?

最佳答案

这两种方法都有其缺点:

  • 第一种方法可能会无限期地拖延队列,以防元素出现永久性交付问题
  • 第二种方法将在队列中无限期保留具有永久交付问题的项目

更好的方法是为失败的项目建立一个单独的阻塞集合,在出现异常时将它们与异常对象一起插入该集合,然后忘记它们。一个单独的线程会将这些项目从队列中取出,分析异常,并决定下一步做什么。它可以安排在适当的时间重新发送,如果失败计数低于某个固定数量则将项目推回,将消息归档以供管理员分析,或者干脆丢弃它,具体取决于系统的需要。

关于c# - 在 BlockingCollection 中处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42970403/

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