简单问题简单对待 求解!!

Xiaoyuan245437 2010-11-12 09:14:06
       
delegate bool sendMsgDelegate(string name, string msg); //申明委托


public static bool sendMsg(string name, string msg)
{
return EmailSend.SendEmail("xxxxxx@163.com", "xxxxxx", "xxxxxxxx@qq.com", name, msg, "smtp.163.com");
}

public static void SendCallBack(IAsyncResult asynceresult)
{
sendMsgDelegate ss = (sendMsgDelegate)asynceresult.AsyncState;
bool result = ss.EndInvoke(asynceresult);
}
static void Main(string[] args)
{
sendMsgDelegate ss = new sendMsgDelegate(sendMsg);
for (int i = 0; i < 5; i++)
{
IAsyncResult asyceresult = ss.BeginInvoke("jack" + i, "Hello" + i, SendCallBack, ss);
}
Console.ReadLine();
}
...全文
271 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
damjmk2 2010-11-12
  • 打赏
  • 举报
回复
那我想到的办法就是定义一个计数器10000,有线程返回那么减1
然后定时查看计数器,直到计数器为0,那么统计完毕
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 damjmk2 的回复:]
因为这样的线程都是异步的..我也不清楚什么时候所有的线程都执行完...

能不能考虑只用一个异步线程来发送邮件呢?
[/Quote]
一个的话那不是不需要用线程池啦!
速度也不是很快把!
damjmk2 2010-11-12
  • 打赏
  • 举报
回复
因为这样的线程都是异步的..我也不清楚什么时候所有的线程都执行完...

能不能考虑只用一个异步线程来发送邮件呢?
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
怎么才知道线程完成了呢?
damjmk2 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 xiaoyuan245437 的回复:]
DateTime t1 = DateTime.Now;
sendMsgDelegate ss = new sendMsgDelegate(sendMsg);
for (int i = 0; i < 10; i++)
{
IAsyncResult asyceresult = ss.BeginInvoke(" " + i, "Hello Worlds" + i, SendCal……
[/Quote]

直接输出来当然不行,要等所有线程都执行完毕了
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复

private static object obj = new object();
static int count = 0;
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
public static void SendCallBack(IAsyncResult asynceresult)
{
sendMsgDelegate ss = (sendMsgDelegate)asynceresult.AsyncState;
lock (obj)
{
bool result = ss.EndInvoke(asynceresult);
if (result)
{
Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
count++;
}
}
}
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
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();


我发现这样写的无法进行统计呢!!!
damjmk2 2010-11-12
  • 打赏
  • 举报
回复
可以输出线程的Id看看到底开了多少线程
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
System.Threading.Thread th1 = new System.Threading.Thread(delegate()
{
for (int i = 0; i < 10000000; i++)
{
sendMsg();
}
});
DateTime t1 = DateTime.Now;
th1.Start();
while (true)
{
if (th1.ThreadState != System.Threading.ThreadState.Stopped)
{
continue;
}
else
{


break;
}
}
th1.Abort();

DateTime t2 = DateTime.Now;
Console.WriteLine("总共花费时间:" + (t2 - t1));

Console.ReadLine();

我这样测试了一下发现用的时间还不到一秒
damjmk2 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 xiaoyuan245437 的回复:]
不大于I 不过有点夸张 就算是小于I 也有很多线程的
[/Quote]

我的意思是要看线程的运行情况...比如说开了3个线程 3 4 5 ,
3, 4线程如果返回了,那么下一次开的还是3,4

也就是说如果线程做的事情不复杂,那么可能只开了5个线程就能满足你运行10000次的情况,只不过是这5个线程轮流使用了
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
不大于I 不过有点夸张 就算是小于I 也有很多线程的
damjmk2 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xiaoyuan245437 的回复:]
会不会出现N多个线程???
线程的个数是不是在I的范围之类 或是跟I有关啊?
[/Quote]

这个是受线程池管理的..估计有线程重用的概念...比如说我返回的线程id是4 3 5 6 4估计4被重复使用了。。这个不太清楚呢,要研究一下线程池的机制,不过可以肯定的是线程的数量不会大于I
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
会不会出现N多个线程???
线程的个数是不是在I的范围之类 或是跟I有关啊?
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
我如果是这样写呢

如果我要进行邮件的批量发送的话 ,

public void Test()
{
sendMsgDelegate ss = sendMsg;

for (int i = 0; i < 5; i++)
{

ss.BeginInvoke("jack" + i, "Hello" + i, SendCallBack, null);
}

}
如果 我要发送 100000个邮箱 难道是
for (int i = 0; i < 1000000; i++)
{

ss.BeginInvoke("jack" + i, "Hello" + i, SendCallBack, null);
}

这样写吗??
damjmk2 2010-11-12
  • 打赏
  • 举报
回复
Thread.CurrentThread.ManagedThreadId 是用这个呢...确实不一定开了5个线程
有时候5个,有时候4个,有时候3个
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 damjmk2 的回复:]
引用 10 楼 damjmk2 的回复:
引用 7 楼 xiaoyuan245437 的回复:
引用 4 楼 damjmk2 的回复:
是的,bool result = ss.EndInvoke(asynceresult);
result 就是一个线程调用sendMsg这个函数的返回值


就是我想统计下有多少邮件是发送成功 有多少是失败的 好统计吗??
在那个callback里面……
[/Quote]

3Q 我试试!!
damjmk2 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 damjmk2 的回复:]
引用 7 楼 xiaoyuan245437 的回复:
引用 4 楼 damjmk2 的回复:
是的,bool result = ss.EndInvoke(asynceresult);
result 就是一个线程调用sendMsg这个函数的返回值


就是我想统计下有多少邮件是发送成功 有多少是失败的 好统计吗??
在那个callback里面怎么写呢?


开了5个线程,也就是说……
[/Quote]

另外要统计成功发送邮件,需要lock...否则结果不准

我的代码需要改一下

要这样
private void CallBackMethod(IAsyncResult ar)
{
doDelegate d = (doDelegate)ar.AsyncState;
//this.richTextBox1.Text += "Threadend\r\n";

lock (obj)
{
this.richTextBox6.Text = this.richTextBox6.Text + "执行成功一次";
}

d.EndInvoke(ar);
}

private static object obj = new object();
damjmk2 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaoyuan245437 的回复:]
引用 8 楼 damjmk2 的回复:
引用 5 楼 xiaoyuan245437 的回复:
还有个问题是
for (int i = 0; i < 5; i++)
{
IAsyncResult asyceresult = ss.BeginInvoke("jack" + i, "Hello Worlds" + i, SendCallBack, ss);
}
for循环是不是等这个方法里……
[/Quote]


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
doSomeThred();
}

/// <summary>
/// 异步线程
/// </summary>
private void doSomeThred()
{
doThreadSynch();
}

private void DoSomeThing(int i, int j)
{
try
{
RichTextBox ri = this.Controls["richTextBox" + (i + 1)] as RichTextBox;
ri.Text += "dobegin\r\n";
Thread.Sleep(2000);
ri.Text += "doend\r\n";
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}

private void CallBackMethod(IAsyncResult ar)
{
doDelegate d = (doDelegate)ar.AsyncState;
//this.richTextBox1.Text += "Threadend\r\n";
this.richTextBox6.Text = this.richTextBox6.Text + "执行成功一次";
this.richTextBox7.Text = this.richTextBox7.Text + Thread.CurrentThread.Name;
d.EndInvoke(ar);
}

private delegate void doDelegate(int i, int j);

private void doThreadSynch()
{
doDelegate dlg = new doDelegate(DoSomeThing);
AsyncCallback acb = new AsyncCallback(CallBackMethod);
//this.richTextBox1.Text += "ThreadBegin\r\n";
for (int i = 0; i < 5; i++)
{
IAsyncResult iar = dlg.BeginInvoke(i, i, acb, dlg);
}
}

}


我测试了一下
for循环不是等这个方法里面的那个方法结束之后进入下一轮循环,是直接开始一个线程,
另外楼上说的线程不是开了5个..请问怎么获取到线程的Id呢?
我用了Thread.CurrentThread.Name 好像没有东西,所以我不知道怎么测试,谢谢了
Xiaoyuan245437 2010-11-12
  • 打赏
  • 举报
回复
这算不算是多线程?
如果我要进行邮件的批量发送的话 ,

public void Test()
{
sendMsgDelegate ss = sendMsg;

for (int i = 0; i < 5; i++)
{

ss.BeginInvoke("jack" + i, "Hello" + i, SendCallBack, null);
}

}
如果 我要发送 100000个邮箱 难道是
for (int i = 0; i < 1000000; i++)
{

ss.BeginInvoke("jack" + i, "Hello" + i, SendCallBack, null);
}

这样写吗??
加载更多回复(12)

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧