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 < 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个时移除一个即可