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 应用程序是半特殊的。由于它们是令人愉快的并行并且有助于隔离,通常每个请求都有自己的线程。但至少对于每个单独的请求,它仍然适用。
我正在尝试编写绘图库。在这个绘图库中有一个应该更新每一帧的更新函数。我通过使用 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 应用程序是半特殊的。由于它们是令人愉快的并行并且有助于隔离,通常每个请求都有自己的线程。但至少对于每个单独的请求,它仍然适用。