小编Vik*_*ram的帖子

C#屏幕流媒体节目

最近我一直在做一个简单的屏幕共享程序.

实际上,该程序可以TCP protocol使用桌面复制API - 一种很酷的服务,支持非常快速的屏幕捕获,还提供有关MovedRegions(仅改变其在屏幕上的位置但仍然存在的UpdatedRegions区域)和(更改区域)的信息.

桌面复制有2个重要属性 - 2个字节数组,一个数组previouspixels和一个NewPixels数组.每4个字节代表RGBA形式的一个像素,例如,如果我的屏幕是1920 x 1080,则缓冲区大小为1920 x 1080*4.

以下是我的策略的重要亮点

  1. 在初始状态(第一次)我发送整个像素缓冲区(在我的情况下它是1920 x 1080*3) - alpha组件在屏幕上总是255 :)
  2. 从现在开始,我遍历UpdatedRegions(它是一个矩形数组),我发送区域边界和Xo'r像素,如下所示:

        writer.Position = 0;
        var n = frame._newPixels;
        var w = 1920 * 4; //frame boundaries.
        var p = frame._previousPixels;
        foreach (var region in frame.UpdatedRegions)
            {
                writer.WriteInt(region.Top);
                writer.WriteInt(region.Height);
                writer.WriteInt(region.Left);
                writer.WriteInt(region.Width);
                for (int y = region.Top, yOffset = y * w; y < region.Bottom; y++, yOffset += w) …
    Run Code Online (Sandbox Code Playgroud)

c# sockets performance

17
推荐指数
1
解决办法
7986
查看次数

Linq中的动态订单

我有一个访问数据库的应用程序,必须根据输入按不同的字段排序结果.

这是我的排序功能:

IQueryable<Entity> GetSortedData(IQueryable<Entity> result, String orderby, bool desc)
{
   switch (orderby.ToLower())
   {
     case "id":
       result = result.OrderBy(c => c.Id);
       break;

     case "code":
       result = result.OrderBy(c => c.Code);
       break;

     case "active":
       result = result.OrderBy(c => c.Active);
       break;

     default:
       result = result.OrderBy(c => c.Name);
       break;
   }

   if (pageData.SortDesc)
   {
     var res = result.ToList();
     res.Reverse();
     return res.AsQueryable();
   }

   return result;      
}
Run Code Online (Sandbox Code Playgroud)

这段代码存在一些我不喜欢的问题:

  1. 重复的代码太多了.如果它是"纯粹的SQL"查询,它看起来像

    SELECT*FROM data_table ORDER BY CASE @OrderBy WHEN'id'Then id when'code'THEN code WHEN'active'THEN
    active ELSE name
    END;

  2. 转换为列表并返回以进行反转.我不能改变返回值类型,我绝对不想写更无用的代码(基本上是翻倍switch …

c# linq

5
推荐指数
1
解决办法
2171
查看次数

如何使用 Console.WriteLine 打印变量

以下代码演示了如何使用 sleep() 方法使线程暂停一段特定的时间。

当我运行此代码时:-

class Program
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("Child thread starts");

            // the thread is paused for 5000 milliseconds
            int sleepfor = 5000;

            Console.WriteLine("Child Thread Paused for {0} seconds");
            Thread.Sleep(sleepfor);
            Console.WriteLine("Child thread resumes");
        }

        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到这个输出-

In Main: Creating the child thread
Child thread starts
Child thread paused …
Run Code Online (Sandbox Code Playgroud)

c#

0
推荐指数
1
解决办法
5442
查看次数

标签 统计

c# ×3

linq ×1

performance ×1

sockets ×1