问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C#多线程模拟同时并发如何实现

发布网友 发布时间:2022-05-06 04:14

我来回答

4个回答

热心网友 时间:2022-06-29 15:05

可参考以下这段代码!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;
namespace Server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}

private void btnStart_Click(object sender, EventArgs e)
{
IPAddress ip = IPAddress.Parse(txtServer.Text);

//网络断点 ip地址和端口号
IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));

//创建负责监听用的socket
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//绑定网络断点
socket.Bind(point);
//监听 10 连接队列的长度
socket.Listen(10);
SetTxt("开始监听");

Thread th = new Thread(Listen);//开启监听的线程
th.IsBackground = true;
th.Start(socket);
}
catch (Exception ex)
{
SetTxt(ex.Message);
}
}

Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
void Listen(object o)
{
//负责监听用的socket
Socket socket = o as Socket;
while (true)
{
try
{
//创建负责通信用的socket
Socket connSocket = socket.Accept();
//获取客户端ip和端口
string ipStr = connSocket.RemoteEndPoint.ToString();
SetTxt(ipStr + ":连接成功");

//填充下拉框
cboUsers.Items.Add(ipStr);
//
dic.Add(ipStr, connSocket);

//开启线程接收消息
Thread th = new Thread(RecMsg);
th.IsBackground = true;
th.Start(connSocket);
}
catch (Exception ex)
{
SetTxt(ex.Message);
}

}

}

void RecMsg(object o)
{
Socket connSocket = o as Socket;
byte[] buffer = new byte[1024 * 1024 * 5];
while (true)
{
try
{
//count实际收到的字节个数
int count = connSocket.Receive(buffer);
string ipStr = connSocket.RemoteEndPoint.ToString();
if (count == 0)
{
SetTxt(ipStr + ":断开连接");
connSocket.Shutdown(SocketShutdown.Both);
connSocket.Close();
break;
}
string msg = Encoding.UTF8.GetString(buffer, 0, count);

SetTxt(ipStr + ":" + msg);
}
catch (Exception ex)
{
SetTxt(ex.Message);
break;
}

}

}

void SetTxt(string t)
{
txtLog.AppendText(t + "\r\n");
}

//发送文字消息
private void btnSend_Click(object sender, EventArgs e)
{
if (cboUsers.SelectedIndex > -1)
{
string key = cboUsers.Text;
byte[] buffer = Encoding.UTF8.GetBytes(txtMsg.Text);

List<byte> list = new List<byte>();
list.Add(1); //协议 1 文字
list.AddRange(buffer);

dic[key].Send(list.ToArray());
}
else
{
MessageBox.Show("请选择客户端");
}
}

//选择路径
private void btnSelect_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
txtPath.Text = ofd.FileName;
}
}

//发送文件
private void btnSendFile_Click(object sender, EventArgs e)
{
if (cboUsers.SelectedIndex > -1)
{
string key = cboUsers.Text;
//dic[key]
//判断文件是否存在
if (txtPath.Text.Length > 0)
{
using (FileStream fs = new FileStream(txtPath.Text,FileMode.Open))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);

List<byte> list = new List<byte>();
list.Add(2 ); //协议 2 文件
list.AddRange(buffer);

dic[key].Send(list.ToArray());
}
}
else
{
MessageBox.Show("请选择文件");
}
}
else
{
MessageBox.Show("请选择客户端");
}
}

//震动
private void btnZD_Click(object sender, EventArgs e)
{
if (cboUsers.SelectedIndex > -1)
{
string key = cboUsers.Text;

byte[] buffer = new byte[1];
buffer[0] = 3; //协议 3 震动

dic[key].Send(buffer);
}
else
{
MessageBox.Show("请选择客户端");
}
}
}
}

热心网友 时间:2022-06-29 15:06

int num=100;
Thread[] th=new Thread[num];
for (int i = 0; i < num; i++)
{
NewThread n = new NewThread(DoWork);
th[i]=n;

}

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

th[i].Start();

}追问这样是不行的,这样做和直接放在上面的那个循环里面是没什么区别的

追答那你就不能这么写了,得用同步机制。
int num=100;
Thread[] th=new Thread[num];
System.Threading.AutoResetEvent wait=new System.Threading.AutoResetEvent(false);
for (int i = 0; i {
wait.WaitOne();
DoWork(obj);
});
th[i]=n;
th[i].Start();
}
Thread.Sleep(1000);
wait.Set();

热心网友 时间:2022-06-29 15:06

不可能真的全部都同时进行的。系统里也是在多个线程高速切换来分配CPU的占用时间

热心网友 时间:2022-06-29 15:07

你以为并发指的是同时执行?追问我们的头让我做这样一个并发的测试工具,他的要求就是等待所有线程建好之后,在同一时刻一起运行,我也是很纠结啊,一直没找到合理的解决方案

c# 多线程 并发 Semaphore\AutoResetEvent都无法解决的需求~有人会吗...

Semaphore可以实现:思路如下:第一步、Semaphore控制起始信号量为0,最大信号量2;第二步、释放一个信号量;第三步、在a方法里面释放一次信号量(释放之后,如果此时b被触发,由于信号量由0变为1,所以b方法也可以执行),然后a方法调用waitone占用一个信号量,a方法执行完毕后在释放一次信号量;第四...

C# 的并发与异步

综上所述,正确理解和使用C#中的并发与异步概念,能够优化程序性能,简化复杂性,提升开发效率。关键在于合理利用Task和async/await机制,结合线程池等底层资源管理,实现高效、灵活的并发编程。

关于C#中多线程并发的处理方案

0就是stdin1就是stdout2就是strerrstdout--标准输出设备(printf(".."))同stdout。stderr--标准错误输出设备两者默认向屏幕输出。但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。用法:fprintf(stderr,"Can'topenit!\n");fprintf(stdout,"Can'topenit!\n"...

c#线程池如何控制并发最大线程数

3. 实现逻辑:我们通过两个AutoResetEvent和线程监听器Monitor,分别实现:wait_sync: 任务线程的 并发执行,每次循环只处理最大10个线程分别对网络做http通讯回话。并且当前循环的10个线程都执行完毕后,才会进行下一次循环处理。 wait_main: 主程序线程的监听和等待,只有所有任务线程都执行完毕后,...

C#同时执行方法

顾名思义,“启动线程”就是新建并启动一个线程的意思,如下代码可实现:Thread thread1 = new Thread(new ThreadStart( Count));其中的 Count 是将要被新线程执行的函数。b.杀死线程 “杀死线程”就是将一线程斩草除根,为了不白费力气,在杀死一个线程前最好先判断它是否还活着(通过 IsAlive 属性...

C#操作多线程的问题,有5个线程同时执行,如何判断5个线程均已执行完毕...

这个需求有很多方法可以实现,给你一个最简单的方法的例子:using System;using System.Threading;public class ThreadDemo{ static void Main() { Console.WriteLine("Hello, I'm going to do some time-consuming work..."); for (int i = 0; i &lt; 5; i++) { Thread t...

c#如何使用多个线程并发执行List集合

当然可以实现的你可以在主线程中查找需要接受信息的用户,对每一个用户启动一个线程,每一个线程处理发给一个用户的信息,这样一来就不必进行并发控制了

c#中怎样让两个函数同时执行

多线程在C#中并不难实现。它有一个命名空间:System.Threading,提供了多线程的支持。要开启一个新线程,需要以下的初始化:ThreadStart startDownload = new ThreadStart( DownLoad ); //线程起始设置:即每个线程都执行DownLoad(),注意:DownLoad()必须为不带有参数的方法 Thread downloadThread = new...

c#多线程写数据库的问题

写线程是不能并发的(无意义,且易死锁),可以考虑设置双队列。并发线程将接收的数据插入队列,然后用一个线程不断的处理将另一个队列的数据写入磁盘,写入工作的线程处理完队列A后和并发接收线程切换一下,写队列B的数据,并发接收线程向A中写数据,这是简单的,也可以设置三个队列切换。甚至更多。看...

C#多线程并发操作与唤醒怎么弄

直接使用ThreadPool 即可.设置MAX 为20.系统自动帮您切换.如果您非要自己做.则可以先制作一个线程池控制变量 当COUNT到达20个时移除一个即可

怎么实现多线程并发 java模拟多线程并发 多线程并发队列实现 java多线程高并发实例 java多线程并发同步 java多线程并发编程 什么是多线程并发 没用多线程有并发么 多线程并发处理
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
6月14什么日子 献血日是为了纪念什么 Win10系统Windows defender提示“此应用已被组策略关闭”怎么办_百度... 6月14日是什么 win10中windows defender无法启动是服务被篡改还是系统bug? 上海自考本科报名条件 如何自己在word设计信纸格式? WPSOffice如何制作标准A4作文稿纸400字 QQ知道信箱和密码 密保问题答案忘记 手机令牌密保卡身份证全没有设置... 现在我的QQ密码我知道 只是被盗号的绑了密保卡 没有密保问题 没绑手机... 赛尔号 依依、吉斯怎么抓? 做梦老公穿上自己的白色透明裤头 apache怎么响应并发的http请求 赛尔号依依怎么抓 有部韩剧女主角穿着特殊裤头去给女儿加油听到喊声就受不了是人么电影 有什么模拟高并发http请求的命令行工具 赛尔号的一一怎么抓? 2.试通过案例,论述在学生管理中应如何判断学校&#47;教师的管理行为属于正当管理行_问一问 赛尔号依依怎么得到 4399赛尔号依依怎么抓 女人的裤头总湿湿的是怎么回事 jmeter 模拟多用户并发请求 电脑连不上网络有一个黄色三角形号是什么原因? 电脑时常出现黄色三角 远古一扫把能PK吗? 女48岁裤头终年潮湿怎么了裤头总是湿的没异味好像有透明液体 DNF北京一扫把价格 女人裤头一般穿什么颜色? 怎么用QQ号注册 怎么用QQ号注册 爱国主义手抄报的图片和内容 并发测试 每次请求都很大 怎么查看每次请求的时间 赛尔号怎么更快抓到依依 草蔻与肉蔻能一起用吗 赛尔号里怎样才能捉到依丁丝 广州证券从业考点在哪里? 赛尔号的闪光依依如何抓 赛尔号的达依依在哪抓 证劵考试广州考场一般在哪里? 赛尔号依依在那? 压力测试过程中主从数据库会带来什么样的问题?怎样来规避遇到的问题? 周大福黄金手链爱挂衣服怎么办? 赛尔号精灵依依在哪 基金从业资格考试广州考点 赛尔号精灵全部怎么捕捉 爱祖国爱家乡爱学校的手抄报图片或者是短一点的内容 马上!要快啊 ! 肉蔻和草寇炖肉哪个好 如何模拟千万并发 golang 赛尔号怎么捕捉所有精灵 戴口罩怎么能让眼镜没有哈气?