最近,我在C# .NET Framework4.5中开发了一个屏幕共享/远程桌面项目。当按下“开始”按钮时,客户端将向服务器发送一个命令,开始发送屏幕截图,直到屏幕共享bool为假为止(即按下“停止”按钮)。
所有数据都以一个字节作为前缀,以标识它是什么命令,下面的4个字节用于测量数据包的长度。
我的问题是,对于这项工作,我应该使用线程还是任务?我需要一个或另一个,否则客户的UI冻结。
下面我使用的是Thread:
private void ProcessCommand(byte command)
{
if (command == Commands.StartRemoteDesktop && !Globals.screensharing)
{
new Thread(StartSharing).Start();
}
}
private void StartSharing()
{
Globals.screensharing = true;
while (Globals.screensharing)
{
Methods.SendCapture();
}
}下面是一个Task的外观:
private void ProcessCommand(byte command)
{
if (command == Commands.StartRemoteDesktop && !Globals.screensharing)
{
Task.Run(() =>
{
while (Globals.screensharing)
{
Methods.SendCapture();
}
});
}
}我不知道这里有什么更好的选择。
发布于 2018-02-11 01:01:37
这取决于你所说的“更好”是什么意思。我会使用Thread,因为作业一直在运行。
Thread对象将是前台线程,这将防止应用程序在运行时终止。
Task.Run会将作业排队,以便在线程池线程上运行。它可能不会立即开始运行,而且它将是一个后台线程,因此如果所有其他前台线程都已终止,它将不会阻止应用程序终止。
线程池可以运行的线程数量是有限的,因此,如果您的作业总是使用其中的一个线程,则增加了其他一些任务延迟运行的可能性。或者,在线程池中的其他任务运行时,作业可能会被延迟。
https://codereview.stackexchange.com/questions/187278
复制相似问题