【求助】如何在循环方法中的值全部循环完成后,再同时执行同一方法??

灵雨飘零 2019-01-16 01:03:18

C#如何在循环方法中的值全部循环完成后,再同时执行同一方法。如:


foreach (Socket s in dictSocket.Values)
{
s.Send(arrMsg);//要求循环完成之后这个方法同时执行。
}


...全文
609 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
heliu3 2019-01-25
  • 打赏
  • 举报
回复
提供一个思路,每循环一次就创建一个线程,然后休眠,等循环完之后唤醒所有线程
  • 打赏
  • 举报
回复
这么说吧,如果要“同时发送”,那么不要使用 windows 等等桌面操作系统,不要使用操作系统而直接用 c、汇编语言去写代码,直接基于 BIOS 或者其它底层的简单系统去自己设计程序。这个时候就无所谓什么进程、线程概念。 这个时候,你就不会纠结概念了。而且你可以自己“创造”任何概念了。
  • 打赏
  • 举报
回复
引用 16 楼 灵雨飘零 的回复:
不好意思,可能我没描述清楚,我的需求就是把一个个循环发送消息,改成同时发送。
在低级的语句层次,同时发送也就是循环发送啊!哪有什么同时执行机器命令的机制? 所谓并发,是指在多线程、多进程操作系统下的编程手段,在所有东西都同步的情况下人家也可以编写分时并发的程序算法出来。不是纠结硬件层低级的什么“同时操作”。
xuzuning 2019-01-24
  • 打赏
  • 举报
回复
想要同一时刻(精确到毫秒)同时给客户端发送消息 这是不可能的,一心不二用,你只有一颗cpu,任何时刻都只能做一件事情
灵雨飘零 2019-01-24
  • 打赏
  • 举报
回复
引用 7 楼 groveer 的回复:
[quote=引用 5 楼 灵雨飘零的回复:][quote=引用 3 楼 groveer 的回复:]
把循环写进一个方法里,循环完了再调用本方法:
Like this:

private void func()
{
foreach(var i in list)
{
Console.WriteLine(i);
}
System.Threading.Thread.Sleep(500);
func();
}



我的想法是把循环调用方法改成同一时刻执行循环内的方法。同一时刻执行。。[/quote]
搞不懂你为啥有这种需求,你的socket对象已经在集合里了,你这样的循环就已经是“同一时刻”执行,因为你有多个socket对象,想使用这些对象,必然要一个个去访问,就算再怎么要封装方法,集合,还是需要一个个去访问[/quote]

不好意思,可能我没描述清楚,我的需求就是把一个个循环发送消息,改成同时发送。
灵雨飘零 2019-01-24
  • 打赏
  • 举报
回复
引用 12 楼 wanghui0380 的回复:
如果简单点plinq也行,只是你的描述有些绕。我不知道你到底是要并行啊,还是要异步等待所有任务完成

而且上下文比较缺乏。从sockect这玩意。我估计你是想同时给多个client发消息,这个直接异步或者plinq就好,交给微软的池自己做就好


不好意思,可能是我没有描述清楚,其实我的意思就是想要同一时刻(精确到毫秒)同时给客户端发送消息,也就是并行。sockect是我从集合中取得,所以用的循环,也可以单独取,然后让所有的sockect同时发消息。
  • 打赏
  • 举报
回复
Send(bytes) 语句执行得很快,如果这么简单的一条语句你也放到子线程中,那么只能说程序运行极慢。根本快不了。 真正要放到线程中的,是对高层次的解析和业务处理任务进行并行化,不在这一类语句层面上设计。这类 for 循环就没有必要实例什么子线程。 另外,你说的“全部循环完成后,在执行同一方法”这个本身就有语法毛病,看不懂。既然执行方法完毕了,为什么再执行一遍?
wanghui0380 2019-01-22
  • 打赏
  • 举报
回复
你觉着那个循环是一个一个发的,因为他是同步代码,对于socket来说他自己现在已经实现了异步发送,所以如果不太纠结“完全一起执行”的话,直接使用socket的异步发送就好,异步代码不会阻塞那里,那个循环一会就表象上结束了,至于实际上的结束,那就得看内部线程池调度,socket自己的限流,上行带宽这些东西了
wanghui0380 2019-01-22
  • 打赏
  • 举报
回复
如果简单点plinq也行,只是你的描述有些绕。我不知道你到底是要并行啊,还是要异步等待所有任务完成

而且上下文比较缺乏。从sockect这玩意。我估计你是想同时给多个client发消息,这个直接异步或者plinq就好,交给微软的池自己做就好
wanghui0380 2019-01-22
  • 打赏
  • 举报
回复
伪代码
Task[] x;

foreach
{
x.add(new task)
}

Task.WhenAll(x).Continue()

同一时间执行,换成俺们的说法就是并行。不过你的需要注意,并行的前提其实是他不并发,只有不并发抢资源的情况我们才大胆的并行,如果底下有并发操作,你只能池化或者限流,让他有限度并行
  • 打赏
  • 举报
回复
另外,啥叫“这个方法执行完之后再执行”呢?
  • 打赏
  • 举报
回复
啥叫“同一时刻执行”呢?
xuzuning 2019-01-22
  • 打赏
  • 举报
回复
delegate void Pile(); Pile pile; foreach (Socket s in dictSocket.Values) { pile += ( ) => { s.Send(arrMsg); }//要求循环完成之后这个方法同时执行。 } pile();
groveer 2019-01-22
  • 打赏
  • 举报
回复
引用 5 楼 灵雨飘零的回复:
[quote=引用 3 楼 groveer 的回复:]
把循环写进一个方法里,循环完了再调用本方法:
Like this:

private void func()
{
foreach(var i in list)
{
Console.WriteLine(i);
}
System.Threading.Thread.Sleep(500);
func();
}



我的想法是把循环调用方法改成同一时刻执行循环内的方法。同一时刻执行。。[/quote] 搞不懂你为啥有这种需求,你的socket对象已经在集合里了,你这样的循环就已经是“同一时刻”执行,因为你有多个socket对象,想使用这些对象,必然要一个个去访问,就算再怎么要封装方法,集合,还是需要一个个去访问
灵雨飘零 2019-01-21
  • 打赏
  • 举报
回复
引用 4 楼 以专业开发人员为伍 的回复:
       foreach (Socket s in dictSocket.Values)
{

}
foreach (Socket s in dictSocket.Values)
{
s.Send(arrMsg);//要求循环完成之后这个方法同时执行。
}



没明白。。。。。
灵雨飘零 2019-01-21
  • 打赏
  • 举报
回复
引用 3 楼 groveer 的回复:
把循环写进一个方法里,循环完了再调用本方法:
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);//要求循环完成之后这个方法同时执行。
         }
groveer 2019-01-16
  • 打赏
  • 举报
回复
把循环写进一个方法里,循环完了再调用本方法:
Like this:

private void func()
{
foreach(var i in list)
{
Console.WriteLine(i);
}
System.Threading.Thread.Sleep(500);
func();
}
平底锅锅锅 2019-01-16
  • 打赏
  • 举报
回复
goto或者在来个for在外面
独立观察员 2019-01-16
  • 打赏
  • 举报
回复
不太清楚,感觉应该用事件订阅什么的吧

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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