while循环阻止其他代码执行c#

while loop prevents other code from executing c#

我正在尝试编写绘图库。在这个绘图库中有一个应该更新每一帧的更新函数。我通过使用 do while loop 来执行此操作,请参见下面的代码:

private void UpdateCanvas()
{
    do
    {
       Canvas.PumpEvents();
       if(UserUpdateVoid != null) UserUpdateVoid();

    } while (Canvas.Exists);
}

我还有一个功能,用户可以在其中设置自己的更新功能。此函数是 SharpDraw class 的一部分,请参见下面的代码:

public void SetCustomUpdateFunction(Action function)
{
    Console.WriteLine("updated the user function");
    UserUpdateVoid = function;
    Console.WriteLine(UserUpdateVoid);
}

所有这些都是通过以下方式调用的:

public class SharpCanvas
{

    private Sdl2Window Canvas;
    private GraphicsDevice GraphicsManager;
    private Action UserUpdateVoid = null;

    public SharpCanvas()
    {
        WindowCreateInfo WindowInfo = new WindowCreateInfo(
            200, 
            200, 
            100, 
            100, 
            WindowState.Normal, 
            "SharpWindow"
        );
        CreateCanvas(WindowInfo);
        UpdateCanvas();
    }
}

而SharpDraw实例的制作方式如下:

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            SharpCanvas Canvas = new SharpCanvas(200,200);
            Canvas.SetCustomUpdateFunction(Update);
        }

        private static void Update(){
            Console.WriteLine("update");
        }
    }
}

但问题是 SetCustomUpdateFunction() 中的 Console.Writelines 永远不会执行。我想这与 while 循环阻止程序进一步执行的事实有关。所以我的问题是如何在保持 while 循环 运行 的同时仍然能够执行不同的代码段?团结起来,他们能够做到:P

如果有什么不清楚的地方,请告诉我,以便我澄清!

当您调用 UpdateCanvas 时,您进入了一个循环,代码永远不会继续。为防止这种情况,您应该使用线程、async-await 或类似的东西(请参阅 this answer 了解 async-await)。

你必须使用多线程编程。在 google 上寻找它,有很多例子。

这是完全正常的。如果您正在 运行 控制台应用程序、Windows 表单或 WPF/UWP 应用程序*:只有一段代码可以执行。虽然一段代码不能 return,但其他代码不能 运行.

您需要添加某种形式的多任务处理。现在它看起来非常像一个控制台应用程序,这是我最后建议学习多线程的地方。我个人的建议是使用 BackgroundWorker 在 Windows 表单下开始。它已经过时并且在实践中很少使用,但它可以帮助您快速了解规则和惯例。但这是一个你可以询问 10 个人并获得 11 个意见的区域。

*Web 应用程序是半特殊的。由于它们是令人愉快的并行并且有助于隔离,通常每个请求都有自己的线程。但至少对于每个单独的请求,它仍然适用。