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#的主要内容,如果未能解决你的问题,请参考以下文章