【求助】如何在循环方法中的值全部循环完成后,再同时执行同一方法?? C#如何在循环方法中的值全部循环完成后,再同时执行同一方法。如: foreach (Socket s in dictSocket.Values) { s.Send(arrMsg);//要求循环完成之后这个方法同时执行。 } 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 goto或者在来个for在外面 把循环写进一个方法里,循环完了再调用本方法:Like this:private void func(){ foreach(var i in list) { Console.WriteLine(i); } System.Threading.Thread.Sleep(500); func();} foreach (Socket s in dictSocket.Values) { } foreach (Socket s in dictSocket.Values) { s.Send(arrMsg);//要求循环完成之后这个方法同时执行。 } 我的想法是把循环调用方法改成同一时刻执行循环内的方法。同一时刻执行。。搞不懂你为啥有这种需求,你的socket对象已经在集合里了,你这样的循环就已经是“同一时刻”执行,因为你有多个socket对象,想使用这些对象,必然要一个个去访问,就算再怎么要封装方法,集合,还是需要一个个去访问 delegate void Pile();Pile pile;foreach (Socket s in dictSocket.Values){ pile += ( ) => { s.Send(arrMsg); }//要求循环完成之后这个方法同时执行。}pile(); 伪代码Task[] x;foreach { x.add(new task)}Task.WhenAll(x).Continue()同一时间执行,换成俺们的说法就是并行。不过你的需要注意,并行的前提其实是他不并发,只有不并发抢资源的情况我们才大胆的并行,如果底下有并发操作,你只能池化或者限流,让他有限度并行 如果简单点plinq也行,只是你的描述有些绕。我不知道你到底是要并行啊,还是要异步等待所有任务完成而且上下文比较缺乏。从sockect这玩意。我估计你是想同时给多个client发消息,这个直接异步或者plinq就好,交给微软的池自己做就好 你觉着那个循环是一个一个发的,因为他是同步代码,对于socket来说他自己现在已经实现了异步发送,所以如果不太纠结“完全一起执行”的话,直接使用socket的异步发送就好,异步代码不会阻塞那里,那个循环一会就表象上结束了,至于实际上的结束,那就得看内部线程池调度,socket自己的限流,上行带宽这些东西了 Send(bytes) 语句执行得很快,如果这么简单的一条语句你也放到子线程中,那么只能说程序运行极慢。根本快不了。真正要放到线程中的,是对高层次的解析和业务处理任务进行并行化,不在这一类语句层面上设计。这类 for 循环就没有必要实例什么子线程。另外,你说的“全部循环完成后,在执行同一方法”这个本身就有语法毛病,看不懂。既然执行方法完毕了,为什么再执行一遍? 不好意思,可能是我没有描述清楚,其实我的意思就是想要同一时刻(精确到毫秒)同时给客户端发送消息,也就是并行。sockect是我从集合中取得,所以用的循环,也可以单独取,然后让所有的sockect同时发消息。 我的想法是把循环调用方法改成同一时刻执行循环内的方法。同一时刻执行。。搞不懂你为啥有这种需求,你的socket对象已经在集合里了,你这样的循环就已经是“同一时刻”执行,因为你有多个socket对象,想使用这些对象,必然要一个个去访问,就算再怎么要封装方法,集合,还是需要一个个去访问不好意思,可能我没描述清楚,我的需求就是把一个个循环发送消息,改成同时发送。 想要同一时刻(精确到毫秒)同时给客户端发送消息这是不可能的,一心不二用,你只有一颗cpu,任何时刻都只能做一件事情 这么说吧,如果要“同时发送”,那么不要使用 windows 等等桌面操作系统,不要使用操作系统而直接用 c、汇编语言去写代码,直接基于 BIOS 或者其它底层的简单系统去自己设计程序。这个时候就无所谓什么进程、线程概念。这个时候,你就不会纠结概念了。而且你可以自己“创造”任何概念了。 Abort 终止线程弹框问题! 关于用vs2010使用jmail发邮件的问题 望高手解答 关于在一个已有项目中接入NHibernate string.Format的一个问题 同时安装vs2003.NET 和vs2005.NET 有没有什么问题啊???? 网络游戏里的聊天的聊天框的透明效果是怎么实现的? C#自定义安装问题 关于抓取取有登陆验证网页面得问题 有谁可详细解释.NET中各文件的用处 用c#怎样实现知道一个qq号是否在线? c#串口传输数据乱码 关于Microsoft.Exchange.WebServices.Data.ExchangeService的错误,请大神指教
Like this:private void func()
{
foreach(var i in list)
{
Console.WriteLine(i);
}
System.Threading.Thread.Sleep(500);
func();
}
{ }
foreach (Socket s in dictSocket.Values)
{
s.Send(arrMsg);//要求循环完成之后这个方法同时执行。
}
搞不懂你为啥有这种需求,你的socket对象已经在集合里了,你这样的循环就已经是“同一时刻”执行,因为你有多个socket对象,想使用这些对象,必然要一个个去访问,就算再怎么要封装方法,集合,还是需要一个个去访问
Pile pile;
foreach (Socket s in dictSocket.Values)
{
pile += ( ) => { s.Send(arrMsg); }//要求循环完成之后这个方法同时执行。
}
pile();
Task[] x;foreach
{
x.add(new task)
}Task.WhenAll(x).Continue()同一时间执行,换成俺们的说法就是并行。不过你的需要注意,并行的前提其实是他不并发,只有不并发抢资源的情况我们才大胆的并行,如果底下有并发操作,你只能池化或者限流,让他有限度并行
不好意思,可能是我没有描述清楚,其实我的意思就是想要同一时刻(精确到毫秒)同时给客户端发送消息,也就是并行。sockect是我从集合中取得,所以用的循环,也可以单独取,然后让所有的sockect同时发消息。
搞不懂你为啥有这种需求,你的socket对象已经在集合里了,你这样的循环就已经是“同一时刻”执行,因为你有多个socket对象,想使用这些对象,必然要一个个去访问,就算再怎么要封装方法,集合,还是需要一个个去访问不好意思,可能我没描述清楚,我的需求就是把一个个循环发送消息,改成同时发送。
这是不可能的,一心不二用,你只有一颗cpu,任何时刻都只能做一件事情