我正在尝试编写图形库。在此图形库中,有一个更新功能,该功能应更新每一帧。我通过使用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
如果有不清楚的地方,请告诉我,以便我澄清!
答案 0 :(得分:2)
那是完全正常的。如果您正在运行控制台应用程序,Windows窗体或WPF / UWP应用程序*,则不会起作用:只能执行一段代码。虽然一段代码不返回,但其他代码无法运行。
您需要在混合中添加某种形式的多任务处理。现在看起来非常像控制台应用程序,这些是我建议学习多线程处理的最后一个地方。我个人的建议是使用BackgroundWorker在Windows窗体下开始。它已过时,在实践中很少使用,但是它可以帮助您快速掌握规则和约定。但这是一个可以邀请10个人并获得11条意见的区域。
* Web应用程序是半特殊的。因为它们令人愉快地并行并且有助于隔离,所以通常每个请求都被赋予自己的线程。但是至少对于每个单个请求,它仍然成立。
答案 1 :(得分:0)
调用UpdateCanvas
时,您进入循环,代码再也行不通了。为避免这种情况,您应该使用线程,异步等待或其他类似的方式(有关异步等待,请参见this answer)。
答案 2 :(得分:0)
您必须使用多线程编程。在Google上寻找它,有很多例子。