Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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#_Winforms_Loops - Fatal编程技术网

C# 检查像素颜色,直到我关闭程序

C# 检查像素颜色,直到我关闭程序,c#,winforms,loops,C#,Winforms,Loops,我发现这个代码: private void PollPixel(Point location, Color color) { while(true) { var c = GetColorAt(location); if (c.R == color.R && c.G == color.G && c.B == color.B) { DoAction();

我发现这个代码:

private void PollPixel(Point location, Color color)
{
    while(true)
    {
        var c = GetColorAt(location);

        if (c.R == color.R && c.G == color.G && c.B == color.B)
        {
            DoAction();
            return;
        }
    }
}
但我不想得到回报;,我想让它一直工作到我关闭程序。如果我删除该返回,程序将无法运行。它将启动一个infinte循环。我希望这个程序注意一个像素,然后如果它改变颜色,DoAction将激活一个宏。然后它将再次开始关注。我该怎么做呢?

您可以使用Thread.Sleep,也可以使用计时器并添加一个间隔来完成您想要的操作。间隔以毫秒为单位

阅读以下帖子,决定什么最适合你:

尝试:

这将为您的方法创建一个线程。不要忘记添加Thread.Sleep1000或任何其他值,否则将创建一个忙循环

编辑:根据要求提供更完整的样本:

private bool run = true; //set this to false when your program closes
private void StartPollPixel(Point location, Color color)
{
    Task.Factory.StartNew( () => {

       while( run )
       {
           var c = GetColorAt(location);

           if (c.R == color.R && c.G == color.G && c.B == color.B)
           {
               DoAction(); //if you manipulate the UI do not forget to Invoke()
               Thread.Sleep(1000);
           }
       }

    });

}

什么是线,睡觉?它编译了吗?实际上没有。我刚刚删除了它。如果你不想返回;把它拿走!如果我删除该程序,该程序将无法运行。它将启动一个infinte循环。如果删除返回,程序将完全按照您描述的方式运行。它将接受颜色和位置,并对其进行监视,直到满足条件,然后调用DoAction,然后继续监视,直到再次满足条件。如果这不是你想要的,你需要更具体。它实际上解决了问题。。。想解释一下为什么不吗?如果他想让它一直运行到程序关闭,它需要在一个单独的线程中运行。OP的问题与线程无关。当然,您可以添加一个线程,以避免锁定UI线程,但是OP的问题与控制流有关,您还没有解决这个问题。你甚至还没有展示他们如何将TPL,正如你所建议的那样,整合到他们的代码中。我提供了一个更完整的例子。我是用定时器完成的,但我没有使用线程。睡眠,这是错的吗?
private bool run = true; //set this to false when your program closes
private void StartPollPixel(Point location, Color color)
{
    Task.Factory.StartNew( () => {

       while( run )
       {
           var c = GetColorAt(location);

           if (c.R == color.R && c.G == color.G && c.B == color.B)
           {
               DoAction(); //if you manipulate the UI do not forget to Invoke()
               Thread.Sleep(1000);
           }
       }

    });

}