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

时间:2019-08-01 17:43:52

标签: c# do-while execution

我正在尝试编写图形库。在此图形库中,有一个更新功能,该功能应更新每一帧。我通过使用do while loop来查看此代码:

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

    } while (Canvas.Exists);
}

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

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");
        }
    }
}

但是问题是Console.Writelines中的SetCustomUpdateFunction()从未执行。我想这与以下事实有关:while循环使程序无法进一步执行。所以我的问题是如何在保持仍然可以执行不同代码段的同时保持while循环运行?他们可以团结一致地做到:P

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

3 个答案:

答案 0 :(得分:2)

那是完全正常的。如果您正在运行控制台应用程序,Windows窗体或WPF / UWP应用程序*,则不会起作用:只能执行一段代码。虽然一段代码不返回,但其他代码无法运行。

您需要在混合中添加某种形式的多任务处理。现在看起来非常像控制台应用程序,这些是我建议学习多线程处理的最后一个地方。我个人的建议是使用BackgroundWorker在Windows窗体下开始。它已过时,在实践中很少使用,但是它可以帮助您快速掌握规则和约定。但这是一个可以邀请10个人并获得11条意见的区域。

* Web应用程序是半特殊的。因为它们令人愉快地并行并且有助于隔离,所以通常每个请求都被赋予自己的线程。但是至少对于每个单个请求,它仍然成立。

答案 1 :(得分:0)

调用UpdateCanvas时,您进入循环,代码再也行不通了。为避免这种情况,您应该使用线程,异步等待或其他类似的方式(有关异步等待,请参见this answer)。

答案 2 :(得分:0)

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