【问题标题】:Ensuring some emails arrive in order while others arrive randomly确保一些电子邮件按顺序到达,而另一些则随机到达
【发布时间】:2012-05-15 00:19:06
【问题描述】:

我正在尝试使用多线程方法同时发送多封电子邮件。这是我的描述:

我有 5 封邮件需要随机发送:

Email1
Email2
Email3
Email4
Email5

可能会先发送 Email5,然后再发送 Email1 或 Email4。

我的客户有一个新要求:Email1,2,3 可能是随机发送的,但 Email4 必须在 Email5 之前发送(用户在 Email5 之前得到一个 Email4,我的意思是一些电子邮件需要按顺序发送,一些需要随机发送)。

我不知道如何使用多线程方法来处理这个问题。

【问题讨论】:

  • 你的意思是Email5必须是Email4之后的下一个,还是Email5可以在Email4之后的任何时间到达,而其他的介于两者之间?
  • 您发送电子邮件的顺序并不能保证相同的交货顺序。大多数电子邮件由发送/接收邮件服务器批量发送,并且许多电子邮件客户端按发送日期排序,而不是发送日期。我知道这不能回答您的问题,因此我将其作为评论发布,但您应该牢记这一点。
  • @p.campbell: 是的,Email5 必须是 Email4 之后的下一个
  • @Chris:我明白了,反正只要Email5一定要在Email4发完之后再发

标签: c# multithreading email


【解决方案1】:

如果您使用任务并行库,使用ContinueWith 很容易满足这种要求

  var firstTask = new Task(() => SendEmail(4));
  var secondTask = firstTask.ContinueWith((t) => SendEmail(5));
  firstTask.Start();

另一种不使用 TPL 的方法可以使用 LinkedList 将必须按顺序发送的电子邮件链接在一起。创建一个Queue<LinkedList<Email>>。您的工作线程使用 Queue 项目,选择 LinkedList,然后将其链接起来发送每个 Email

【讨论】:

  • 谢谢,但我怎么能在 .net 2.0 中做同样的事情?
【解决方案2】:

分配优先级?但是除非您实际上拥有与邮件服务器的多个连接,否则您的邮件无论如何都会按顺序发送出去......

【讨论】:

    【解决方案3】:

    将一个信号量与每封电子邮件相关联,并获取电子邮件 5 的线程并在电子邮件 4 发送电子邮件之前等待电子邮件 4 的信号量。每个信号量都应该用零个许可进行初始化,并且线程应该在发送电子邮件后释放一个许可。您也可以使用互斥锁来做到这一点。

    【讨论】:

    • 只有当你知道这是家庭作业并且希望使用信号量时,这才有用。否则这种方法将无法扩展。
    【解决方案4】:

    如果您使用工作模式,则将工作队列拆分为有序和非有序(两个工作队列),并让序列队列仅由一个线程提供服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      相关资源
      最近更新 更多