首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#屏幕共享项目

C#屏幕共享项目
EN

Code Review用户
提问于 2018-02-10 20:31:42
回答 1查看 923关注 0票数 0

最近,我在C# .NET Framework4.5中开发了一个屏幕共享/远程桌面项目。当按下“开始”按钮时,客户端将向服务器发送一个命令,开始发送屏幕截图,直到屏幕共享bool为假为止(即按下“停止”按钮)。

所有数据都以一个字节作为前缀,以标识它是什么命令,下面的4个字节用于测量数据包的长度。

我的问题是,对于这项工作,我应该使用线程还是任务?我需要一个或另一个,否则客户的UI冻结。

下面我使用的是Thread

代码语言:javascript
复制
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的外观:

代码语言:javascript
复制
private void ProcessCommand(byte command)
{
    if (command == Commands.StartRemoteDesktop && !Globals.screensharing)
    {
        Task.Run(() =>
        {
            while (Globals.screensharing)
            {
                Methods.SendCapture();
            }
        });
    }
}

我不知道这里有什么更好的选择。

EN

回答 1

Code Review用户

发布于 2018-02-11 01:01:37

这取决于你所说的“更好”是什么意思。我会使用Thread,因为作业一直在运行。

Thread对象将是前台线程,这将防止应用程序在运行时终止。

Task.Run会将作业排队,以便在线程池线程上运行。它可能不会立即开始运行,而且它将是一个后台线程,因此如果所有其他前台线程都已终止,它将不会阻止应用程序终止。

线程池可以运行的线程数量是有限的,因此,如果您的作业总是使用其中的一个线程,则增加了其他一些任务延迟运行的可能性。或者,在线程池中的其他任务运行时,作业可能会被延迟。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/187278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档