javamail 多线程发送邮件发生错发邮件的问题
你能确定这个 MailSend mailSend 参数在多个线程中肯定不会共用?
多线程中数据错乱肯定都是多个线程在使用同一个东西,当我们当参数传递时要避免这个参数在多个地方使用,而当我们的代码自己去取参数而这个参数可能其它人修改它时要有办法处理线程同步的问题,对于某个只在一个线程内使用却有一种类似静态调用的方式“自己去拿而不是别人传参数”的时候我们或许可以考虑成 ThreadLocal 型的变量。
.saveChanges(); 时会开始从 handler 中读取附件的内容,这个时候 handler 对应的 data source 应该不会被多个线程同时访问才好,当我们没有明确地调用它时在 send 的时候也会自动调用的。
163邮箱附件提示2个线程
超大附件是没有下载次数限制的,只要在30内下载就可以,如果对方用的是企业邮箱给你发的超大附件,限制下载次数是对方决定的。
超大附件是没有下载次数限制的,只要在30内下载就可以,如果对方用的是企业邮箱给你发的超大附件,限制下载次数是对方决定的。建议您安装下网易邮箱助手再试试。
关于多线程发邮件的问题!!
设计这个线程的时候,应该由线程决定要发送哪些,而不是在线程外部生成了Dt再从DT中找要发送的内容。这样就使得你的 *** SendAsyncProcess不能做到多次发送。
问题出在,你利用sql获得的数据如果是按你所说只获取了10个,那么该线程执行完毕后就不能再执行了。
这里我感觉你应该设计为下面的样子:
在SendAsyncProcess *** 中读取10个待发送的邮件,然后发送,发送完毕后继续循环再获取十个,这样重复执行,每次执行间隔10秒。这样就能够实现的需求了。
public void SendAsync()
{
Thread thSendMail = new Thread(new ParameterizedThreadStart(this.SendAsyncProcess));
thSendMail.Start()
thSendMail.Join();
}
private void SendAsyncProcess()
{
SqlDataport sp = new SqlDataport();
string sql = "select top 10 * from tbl_sendmailList";
DataTable dt == sp.getTableResult(sql);
if(dt==null || dt.Rows.Count==0) return ;
while(dt.Rows.Count0)
{
MailModel[] mailList = new MailModel[dt.Rows.Count];
for (int i = 0; i dt.Rows.Count; i++)
{
MailModel mm = new MailModel();
mm.Body = dt.Rows[i]["body"].ToString();
mm.Subject = dt.Rows[i]["subject"].ToString();
mm.ToEmail = dt.Rows[i]["toemail"].ToString();
mm.IsBodyHtml = true;
mailList[i] = mm;
}
MailMessage m;
SmtpClient objClient = GetSmtpClientInst();
for (int i = 0; i mailList.Length; i++)
{
m = new MailMessage();
m.Subject = listInfo[i].Subject;
m.SubjectEncoding = Encoding.UTF8;
m.From = new MailAddress(this._fromEmail, this._displayName);
m.To.Add(listInfo[i].ToEmail);
m.Body = listInfo[i].Body;
m.IsBodyHtml = listInfo[i].IsBodyHtml;
m.BodyEncoding = Encoding.UTF8;
objClient.Send(m);
}
dt = = sp.getTableResult(sql);
Thread.Sleep(10000);
}
}
你的代码稍微改了一下,应该可以简单满足你的要求,当然这段代码还有很多可优化的地方,我就不帮你改了,你可以参考原理进行改进。希望能帮助你,:)
Epassion是一群在.NET技术方面有多年经验的年轻人组成的开源组织。我们以技术为核心梦想着开发真正属于中国人自己开发的框架系统。当前我们已经开发出来了对象持久化框架Epassion.Data,该框架是基于微软的ADO.NET的一套对象-关系数据映射的组件。可以让你轻松的进行业务逻辑层建立,而不需要考虑具体的SQL语句,这种开发模式也是当前较为流行的模式。
我们还将推出一系列的web组件,让你的web界面设计更见简单。
我们更希望您能加入我们,我们希望有技术的人给我们好的建议,我们也希望能够帮助那些刚刚入行的人,给您提供一些技术支持。让中国人的技术水平提高的更快。
我们的 *** 群是:50792130
我们的网站是:
我们等待您的加入。
求高手解答 用C#如何实现多线程控制多个邮箱,一个线程控制一个邮箱发邮件,发邮件的 *** 已实现。
MSDN:
.NET Framework 类库
Thread 类
创建并控制线程,设置其优先级并获取其状态。
命名空间:System.Threading
程序集:mscorlib(在 mscorlib.dll 中)
备注
一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。使用 ThreadStart 委托或 ParameterizedThreadStart 委托指定由线程执行的程序代码。使用 ParameterizedThreadStart 委托可以将数据传递到线程过程。
在线程存在期间,它总是处于由 ThreadState 定义的一个或多个状态中。可以为线程请求由 ThreadPriority 定义的调度优先级,但不能保证操作系统会接受该优先级。
GetHashCode 提供托管线程的标识。在线程的生存期内,无论获取该值的应用程序域如何,它都不会和任何来自其他线程的值冲突。
注意
操作系统 ThreadId 和托管线程没有固定关系,这是因为非托管宿主能控制托管与非托管线程之间的关系。特别是,复杂的宿主可以使用 CLR Hosting API 针对相同的操作系统线程调度很多托管线程,或者在不同的操作系统线程之间移动托管线程。
下面的代码示例说明简单的线程处理功能。
using System;
using System.Threading;
// Simple threading scenario: Start a static method running
// on a second thread.
public class ThreadExample {
// The ThreadProc method is called when the thread starts.
// It loops ten times, writing to the console and yielding
// the rest of its time slice each time, and then ends.
public static void ThreadProc() {
for (int i = 0; i 10; i++) {
Console.WriteLine("ThreadProc: {0}", i);
// Yield the rest of the time slice.
Thread.Sleep(0);
}
}
public static void Main() {
Console.WriteLine("Main thread: Start a second thread.");
// The constructor for the Thread class requires a ThreadStart
// delegate that represents the method to be executed on the
// thread. C# simplifies the creation of this delegate.
Thread t = new Thread(new ThreadStart(ThreadProc));
// Start ThreadProc. On a uniprocessor, the thread does not get
// any processor time until the main thread yields. Uncomment
// the Thread.Sleep that follows t.Start() to see the difference.
t.Start();
//Thread.Sleep(0);
for (int i = 0; i 4; i++) {
Console.WriteLine("Main thread: Do some work.");
Thread.Sleep(0);
}
Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
t.Join();
Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
Console.ReadLine();
}
}
此代码产生的输出类似如下内容:
Main thread: Start a second thread.
Main thread: Do some work.
ThreadProc: 0
Main thread: Do some work.
ThreadProc: 1
Main thread: Do some work.
ThreadProc: 2
Main thread: Do some work.
ThreadProc: 3
Main thread: Call Join(), to wait until ThreadProc ends.
ThreadProc: 4
ThreadProc: 5
ThreadProc: 6
ThreadProc: 7
ThreadProc: 8
ThreadProc: 9
Main thread: ThreadProc.Join has returned. Press Enter to end program.
关于邮件群发多线程的问题,求助
双翼邮件群发软件支持多线程,但如今邮箱商都有速度限制,一般只用一个线程发送就足够了。当然你邮箱支持的话可以用多个线程的!
发邮件显示从消息线程删除大量
可靠性要求高时选择消息队列:
消息队列和多线程两者并不冲突,多线程可以作为队列的生产者和消费者。
不着急知道结果,尽量使用消息队列,保证服务器的压力减小,因为多线程对cpu的消耗大:
用线程的话,会占用主服务器资源, 消息队列的话, 可以放到其他机器上运行, 让主服务器尽量多的服务其他请求。
需要解耦的时候用消息队列:
解耦更充分,架构更合理
多线程是在编程语言层面解决问题
消息队列是在架构层面解决问题
容易出现线程安全问题或者批量操作时,尽量使用消息队列:
批量发送邮件时,数据量庞大,如果使用多线程对系统不安全
ain thread: Do some work. ThreadProc: 3 Main thread: Call Join(), to wait until ThreadProc ends. ThreadProc: 4 ThreadProc: 5 Th
参数可能其它人修改它时要有办法处理线程同步的问题,对于某个只在一个线程内使用却有一种类似静态调用的方式“自己去拿而不是别人传参数”的时候我们或许可以考虑成 ThreadLocal 型的变量。.saveChanges(); 时会开始从 handler 中读取附件