首页 新闻 会员 周边

请教一下关于多线程发送邮件的问题!!

3
悬赏园豆:40 [已解决问题] 解决于 2010-11-12 14:22

1.线程池
  protected void Page_Load(object sender, EventArgs e)
  {
  System.Threading.WaitCallback waitCallback = new WaitCallback(MyWork);
  ThreadPool.QueueUserWorkItem(waitCallback, "第一个线程");
  }
  public static void MyWork(object state)
  {

   //执行代码

  }
2.
Thread th = new Thread(delegate()
  {

        //执行代码
  });
  th.Start();
  while (true)
  {
  if (th.ThreadState != ThreadState.Stopped)
  continue;
  break;
  }
  th.Abort();
3.
 GatherDelegate delegate1 = delegate()
                                           {
                                              
//执行抓取方法;
                                               for (int i = 0; i < count; i++)
                                               {
                                                  
lock (this)
                                                   {
                                                       num1
+= 1;
                                                   }
                                               }

                                           };

            IAsyncResult result1
= delegate1.BeginInvoke(null, null);
            delegate1.EndInvoke(result1);

 

   我想请教一些 这几种方法的 优点和缺点在那里  发邮件适合哪一种???

Fry_CiCi的主页 Fry_CiCi | 初学一级 | 园豆:0
提问于:2010-11-10 17:17
< >
分享
最佳答案
0

我会选择第三种

第一种:只能使用无返回值方法,无法对结果进行处理

第二种:打开新的工作线程,需要较大代价,只使用极短时间没有必要

第三种:个人感觉比较好,执行完成后可以回调处理结果。如下代码:

using System;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
"start");

sendMessageDelegate action
= new sendMessageDelegate(sendMessage); //实例化委托
object param="end";
for (int i = 0; i < 10; i++)
{
action.BeginInvoke(
string.Concat(param,i), new AsyncCallback(sendCallback), action); //异步执行
}

Console.ReadLine();
}

delegate object sendMessageDelegate(object message);//申明委托

public static void sendCallback(IAsyncResult asyncResult) //异步回调函数
{
sendMessageDelegate action
= (sendMessageDelegate)asyncResult.AsyncState;
object result = action.EndInvoke(asyncResult); //执行完成对结果处理
// 对结果进行处理
Console.WriteLine(result);
}

public static object sendMessage(object message) //执行函数,注意线程安全
{
Console.WriteLine(
"send");
//执行代码
return message;
}
}
}

 

收获园豆:35
wgz | 小虾三级 |园豆:1254 | 2010-11-10 20:36
不知道怎么说 先自己测试下把!! 谢谢啦
Fry_CiCi | 园豆:0 (初学一级) | 2010-11-11 15:15
请问一下 如果我要在你所说的程序中加2个线程?? 应该怎么做 ??是写在 callback中吗?
Fry_CiCi | 园豆:0 (初学一级) | 2010-11-11 16:09
只要遍历参数,将参数传入执行就OK了,会自动将执行方法加入到线程池中,不过一定要注意执行方法的线程安全。把代码改了下,可以看下
wgz | 园豆:1254 (小虾三级) | 2010-11-12 00:35
这位大哥 我看你一直强调线程的安全 应该注意那些细节 ?
Fry_CiCi | 园豆:0 (初学一级) | 2010-11-12 09:01
for (int i = 0; i < 10; i++) { action.BeginInvoke(string.Concat(param,i), new AsyncCallback(sendCallback), action); //异步执行 } 还有 这个循环是不是说的是线程的数量?? 开了10个线程放入线程池??
Fry_CiCi | 园豆:0 (初学一级) | 2010-11-12 09:09
线程池是系统已经分配好的,可以动态配置线程池的大小以及其他信息,委托实例调用BeginInvoke后会把执行任务丢到线程池中排队执行,如果线程池存在空闲线程则在这个线程中执行,如果没有空闲线程则阻塞等待,执行完成后线程池中线程不会关闭,重新变为空闲线程。至于线程安全,不是一两句能说明白的,没有好的资料推荐,网上搜搜吧。个人理解:线程说白了也就是要管理好竞争资源,防止死锁,脏数据读写;给用户一种多个任务执行的假象(如果是单核的话)
wgz | 园豆:1254 (小虾三级) | 2010-11-12 10:21
private static object obj = new object(); static int count = 0; //计数 public static bool sendMsg(string name, string msg) { return EmailSend.SendEmail("t@163.com", "c", "3@qq.com", name, msg, "smtp.163.com"); // Console.Write(name); } public static void SendCallBack(IAsyncResult asynceresult) { sendMsgDelegate ss = (sendMsgDelegate)asynceresult.AsyncState; lock (obj) { bool result = ss.EndInvoke(asynceresult); if (result) { count++; } } } static void Main(string[] args) { DateTime t1 = DateTime.Now; sendMsgDelegate ss = new sendMsgDelegate(sendMsg); for (int i = 0; i < 10; i++) { IAsyncResult asyceresult = ss.BeginInvoke(" " + i, "Hello Worlds" + i, SendCallBack, ss); } DateTime t2 = DateTime.Now; Console.WriteLine(); Console.WriteLine("总共花费时间:" + (t2 - t1)); Console.WriteLine("成功发送" + count); Console.ReadLine(); } 这个是我写的方法 但是不能统计发送邮箱的数量和时间 应该怎么去判断所有的线程执行完毕呢?
Fry_CiCi | 园豆:0 (初学一级) | 2010-11-12 11:45
我怎么没有编辑器 汗
Fry_CiCi | 园豆:0 (初学一级) | 2010-11-12 11:47
可以使用AutoResetEvent来进行控制,根据你的代码,写了一下,已经在短信息里面发给你了
wgz | 园豆:1254 (小虾三级) | 2010-11-12 16:03
其他回答(1)
0

1,3实质是一样的,都是使用线程池处理,2是独立自己开的线程。

发邮件的话还是得看以具体的需求,这几种方案也都能做到。只是第二种要灵活一些:)

收获园豆:5
LittlePeng | 园豆:3445 (老鸟四级) | 2010-11-10 20:15
我一开始用的是第二种 不过好像第二种耗费的资源比较多??
支持(0) 反对(0) Fry_CiCi | 园豆:0 (初学一级) | 2010-11-11 15:10
第一种自己写个回调也是一样的吧。感觉简单应用随便怎么着,复杂的还是自己定制线程池,总的说就是最大限度的利用cpu资源,同时避免不必要消耗。 推荐个SmartThreadPool,功能比较多,有些场景挺好用的
支持(0) 反对(0) LittlePeng | 园豆:3445 (老鸟四级) | 2010-11-13 15:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册