Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不影响性能的情况下不断拍摄屏幕快照?_C#_Windows_Screenshot - Fatal编程技术网

C# 如何在不影响性能的情况下不断拍摄屏幕快照?

C# 如何在不影响性能的情况下不断拍摄屏幕快照?,c#,windows,screenshot,C#,Windows,Screenshot,要求如下: 我必须发出命令请求屏幕截图。扭曲?该命令指定一个时间,该时间是过去的。记住,不是永远,只是在30秒内 我的命令指示实际的秒数,相应的屏幕截图将从滚动缓存中提取并保存在另一个进程的永久位置 为了做到这一点,我必须每秒钟拍摄一张截图,并将其保存30秒。之后,缓存可以清除自身 我的问题是 什么样的屏幕截图方法对桌面的影响最小?我无法想象每秒一帧会对性能造成严重影响。您是否尝试过最简单的方法来查看它是否会影响性能 查看以获取有关如何获取屏幕截图的信息 我建议您使用计时器: var ssTim

要求如下:

我必须发出命令请求屏幕截图。扭曲?该命令指定一个时间,该时间是过去的。记住,不是永远,只是在30秒内

我的命令指示实际的秒数,相应的屏幕截图将从滚动缓存中提取并保存在另一个进程的永久位置

为了做到这一点,我必须每秒钟拍摄一张截图,并将其保存30秒。之后,缓存可以清除自身

我的问题是


什么样的屏幕截图方法对桌面的影响最小?

我无法想象每秒一帧会对性能造成严重影响。您是否尝试过最简单的方法来查看它是否会影响性能

查看以获取有关如何获取屏幕截图的信息

我建议您使用计时器:

var ssTimer = new System.Threading.Timer((s) =>
    {
      GetAndStoreScreenShot();
    }, null, 1000, 1000);
您需要在缓存上进行一些同步,以防止线程问题(即,在推出缓存时尝试读取缓存中的第一项)。锁可能是最容易使用的,因为它不会对性能特别敏感

至于缓存使用什么,我建议使用
LinkedList
。添加到列表(
AddLast()
)并删除第一个项目(
RemoveFirst()
)很容易,而且由于您只有30个项目,并且屏幕截图请求相对较少,因此顺序扫描以获取第n个项目不会太耗时


或者您可以使用
列表
数组
实现一个简单的循环缓冲区。增加一个索引作为插入点,在末端增加时环绕。然后,查找就变成了一个简单的模运算。

按照Jim所说的,您可以将您的工作屏幕截图集存储在
ConcurrentDictionary
中,并有两个计时器:第一个计时器将您的屏幕截图添加到字典中,第二个将从字典中删除任何超过30秒的内容

然而,这将是可怕的性能几乎任何方式你切片它

大致如下:

        var imageDictionary = new ConcurrentDictionary<DateTime, Bitmap>();

        var screenshotTaker = new System.Timers.Timer(1000);
        screenshotTaker.Elapsed += (sender, e) =>
                                       {
                                           Bitmap bmp = GetScreenshot();
                                           imageDictionary.TryAdd(DateTime.Now, bmp);
                                       };

        var screenshotRemover = new System.Timers.Timer(1000);
        screenshotRemover.Elapsed += (sender, e) =>
                                         {
                                             RemoveExpiredBitmaps();
                                         };

        screenshotTaker.Start();
        screenshotRemover.Start();
var-imageDictionary=new-concurrentdirectionary();
var screenshotTaker=新系统计时器计时器(1000);
截屏者。经过时间+=(发送者,e)=>
{
位图bmp=GetScreenshot();
imageDictionary.TryAdd(DateTime.Now,bmp);
};
var screenshotRemover=新系统计时器计时器计时器(1000);
screenshotRemover.Appead+=(发送方,e)=>
{
RemoveExpiredBitmaps();
};
screenshotTaker.Start();
screenshotRemover.Start();

不需要第二个计时器。只需使用一个链表或循环缓冲区。所有方法都会回到使用两个系统API,例如:仅供参考:我编写了一个程序(扑克机器人),大约每秒截图一次,使用一点OCR和一些自动玩扑克的策略。它运行了数周而没有任何性能下降,这是几年前在一台内存为2G的PC上实现的。