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

Posted

技术标签:

【中文标题】while循环阻止其他代码执行c#【英文标题】:while loop prevents other code from executing c# 【发布时间】:2019-08-01 17:43:52 【问题描述】:

我正在尝试编写一个绘图库。在这个绘图库中,有一个更新函数应该更新每一帧。我通过使用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");
        
    

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

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

【问题讨论】:

while 循环永远不会退出,如果您希望发生 任何事情,则需要在单独的线程上运行它。 酷,是的,它确实应该运行到应用程序关闭。您能否解释一下如何创建威胁之类的东西,我对 c# 很陌生 从Asynchronous Programming开始 感谢所有伟大的建议!我将研究多线程编程:) SharpCanvas Canvas = new SharpCanvas(200,200); 接受 2 个参数的构造函数在哪里 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于while循环阻止其他代码执行c#的主要内容,如果未能解决你的问题,请参考以下文章

循环语句总结(代码以C#为例)

在 do while 循环内部,我想在 c# 中每 1 分钟执行一次特定代码,直到条件满足

C# 四种循环体的使用与区别

PHP循环阻止其余代码执行[关闭]

C#传智:分支Switch与循环While(第四天)

while循环