Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确保一些电子邮件按顺序到达,而另一些则随机到达_C#_Multithreading_Email - Fatal编程技术网

C# 确保一些电子邮件按顺序到达,而另一些则随机到达

C# 确保一些电子邮件按顺序到达,而另一些则随机到达,c#,multithreading,email,C#,Multithreading,Email,我正在尝试使用多线程方法同时发送多封电子邮件。以下是我的描述: 我需要随机发送5封电子邮件: Email1 Email2 Email3 Email4 Email5 可能先发送Email5,然后再发送Email1或Email4 我对我的客户提出了一个新的要求:Email1、2、3可能是随机发送的,但Email4必须在Email5之前发送(用户在Email5之前收到Email4,我的意思是有些电子邮件需要按订单发送,有些则是随机发送) 我不知道如何使用多线程方法来处理这个问题 分配优先级?但是,除

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

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

Email1
Email2
Email3
Email4
Email5
可能先发送Email5,然后再发送Email1或Email4

我对我的客户提出了一个新的要求:Email1、2、3可能是随机发送的,但Email4必须在Email5之前发送(用户在Email5之前收到Email4,我的意思是有些电子邮件需要按订单发送,有些则是随机发送)


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

分配优先级?但是,除非您实际拥有与邮件服务器的多个连接,否则您的邮件将按顺序发送…

将一个信号量与每封电子邮件关联,并让电子邮件5的线程获取,然后等待电子邮件4的信号量,然后再发送电子邮件。每个信号量都应该初始化为零许可,线程在发送电子邮件后应该释放一个许可。您也可以使用互斥体来实现这一点。

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


另一种不使用TPL的方法是使用
LinkedList
将必须按顺序发送的电子邮件链接在一起。创建一个
队列
。您的工作线程使用
队列
项,选择一个
链接列表
,然后链接它发送每个
电子邮件

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

只有当您知道这是一个排序作业并且需要使用信号量时,这才有用。否则,此方法将无法扩展。您的意思是,Email5必须是Email4之后的下一个,还是Email5可以在Email4之后的任何时间到达,而其他邮件则介于两者之间?您发送电子邮件的顺序不保证相同的交货顺序。大多数电子邮件是通过发送/接收邮件服务器批量发送的,许多电子邮件客户端按发送日期排序,而不是按发送日期排序。我知道这并不能回答你的问题,因此我发表了一篇评论,但这是你应该记住的。@p.campbell:是的,Email5必须是下一个Email4@Chris:我明白了,只要在发送电子邮件4之后必须发送电子邮件5,谢谢。但是在.net 2.0中,我怎么能以同样的方式发送呢?
  var firstTask = new Task(() => SendEmail(4));
  var secondTask = firstTask.ContinueWith((t) => SendEmail(5));
  firstTask.Start();