C# 在不阻塞UI线程的情况下拍摄屏幕截图

C# 在不阻塞UI线程的情况下拍摄屏幕截图,c#,winforms,C#,Winforms,我有一些经验,但我对WinForms还不熟悉 我有一种方法,它将屏幕截图作为位图: public Bitmap GetSreenshot() { Rectangle bounds = Screen.PrimaryScreen.Bounds; Bitmap bmp = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppArgb); Graphics gfx = Graphics

我有一些经验,但我对WinForms还不熟悉

我有一种方法,它将屏幕截图作为
位图

public Bitmap GetSreenshot() 
{
    Rectangle bounds = Screen.PrimaryScreen.Bounds;

    Bitmap bmp = new Bitmap(bounds.Width, bounds.Height,
        PixelFormat.Format32bppArgb);

    Graphics gfx = Graphics.FromImage(bmp);

    gfx.CopyFromScreen(bounds.X,
                                   bounds.Y,
                                   0,
                                   0,
                                   bounds.Size,
                                   CopyPixelOperation.SourceCopy);

    return bmp; 
} 
我的问题是,我在一个间隔约100毫秒的计时器中使用这个。每次截图时,我都会注意到UI线程受到影响(移动表单时出现延迟等)


有没有办法在另一个线程上生成屏幕截图,这样就不会影响UI?我读过一些关于BackgroundWorker的文章,是这样吗?如果有人能在这里为我指出正确的方向,我将不胜感激。

从评论到回答:


后台工作程序是一种方法,但如果.NET4.0对您可用,您也可以查看任务并行库(任务和任务)。NET4.5还支持异步/等待模式,这是非常有用的


这将提供进一步的信息

后台工作者是一种方法,但如果.NET 4.0对您可用,您也可以查看任务并行库(
Task
Task
)。NET 4.5还支持异步/等待模式,该模式非常有用。@Grumbler85好的,是的,它是可用的。后台工作者与TPL相比有什么缺点吗?我个人喜欢异步/等待模式,因为您不必将代码拆分为启动块和结果处理块(bgworker和task都需要它们)。。这可以提供进一步的信息