UI 通过 tcp 发送图像时冻结
UI freezes when sending image over tcp
我编写此代码以将屏幕截图发送到多个连接的 clients.Works 在客户端很好,但冻结了服务器 UI 上的应用程序 side.I 不明白是什么导致了这个问题。
public void LoopClients()
{
while (_isRunning)
{
TcpClient newClient = Server.AcceptTcpClient();
Thread t = new Thread(new
ParameterizedThreadStart(HandleClient));
t.Start(newClient);
}
}
public void HandleClient(object obj)
{
TcpClient client = (TcpClient)obj;
BinaryFormatter binaryformatter = new BinaryFormatter();
while (client.Connected)
{
MainStream = client.GetStream();
binaryformatter.Serialize(MainStream, GrabDesktop());
}
}
private static Image GrabDesktop()
{
System.Drawing.Rectangle bound = Screen.PrimaryScreen.Bounds;
Bitmap screenshot = new Bitmap(bound.Width, bound.Height, PixelFormat.Format32bppArgb);
Graphics graphics = Graphics.FromImage(screenshot);
graphics.CopyFromScreen(bound.X, bound.Y, 0, 0, bound.Size, CopyPixelOperation.SourceCopy);
return screenshot;
}
任何改进代码或修复以解决问题的帮助或建议都会有很大帮助。
由于服务器正在列出新客户端以通过迭代循环连接,这可能会阻塞您的主 UI 线程。 运行 使用新线程。
public void LoopClients()
{
Thread t1 = new Thread(() =>
{
while (_isRunning)
{
TcpClient newClient = Server.AcceptTcpClient();
Thread t = new Thread(new
ParameterizedThreadStart(HandleClient));
t.Start(newClient);
}
}).Start()
}
注意:它并不总是需要为 HandleClient
设置 new threads
,但这不是问题
您是否意识到您正在 while 循环中创建一个新线程?
这意味着您将创建很多线程。
去掉while循环就万事大吉了
我编写此代码以将屏幕截图发送到多个连接的 clients.Works 在客户端很好,但冻结了服务器 UI 上的应用程序 side.I 不明白是什么导致了这个问题。
public void LoopClients()
{
while (_isRunning)
{
TcpClient newClient = Server.AcceptTcpClient();
Thread t = new Thread(new
ParameterizedThreadStart(HandleClient));
t.Start(newClient);
}
}
public void HandleClient(object obj)
{
TcpClient client = (TcpClient)obj;
BinaryFormatter binaryformatter = new BinaryFormatter();
while (client.Connected)
{
MainStream = client.GetStream();
binaryformatter.Serialize(MainStream, GrabDesktop());
}
}
private static Image GrabDesktop()
{
System.Drawing.Rectangle bound = Screen.PrimaryScreen.Bounds;
Bitmap screenshot = new Bitmap(bound.Width, bound.Height, PixelFormat.Format32bppArgb);
Graphics graphics = Graphics.FromImage(screenshot);
graphics.CopyFromScreen(bound.X, bound.Y, 0, 0, bound.Size, CopyPixelOperation.SourceCopy);
return screenshot;
}
任何改进代码或修复以解决问题的帮助或建议都会有很大帮助。
由于服务器正在列出新客户端以通过迭代循环连接,这可能会阻塞您的主 UI 线程。 运行 使用新线程。
public void LoopClients()
{
Thread t1 = new Thread(() =>
{
while (_isRunning)
{
TcpClient newClient = Server.AcceptTcpClient();
Thread t = new Thread(new
ParameterizedThreadStart(HandleClient));
t.Start(newClient);
}
}).Start()
}
注意:它并不总是需要为 HandleClient
设置 new threads
,但这不是问题
您是否意识到您正在 while 循环中创建一个新线程? 这意味着您将创建很多线程。 去掉while循环就万事大吉了