在不中断进程或主线程的情况下连续运行代码



我正在尝试持续运行代码,以尽可能快的速度执行函数(除非有指定的速率。(当我以前使用d java时,有一个调度程序或计时器,我用它在一定的延迟内连续运行代码,而不需要多线程。我正在寻找类似的东西,但不要拖延。

我已经尝试过多线程,然后使用while循环,使用thread.sleep添加可选延迟,然后调用一个方法返回到主线程。这个问题是它冻结了我的过程,并导致它";没有响应";在任务管理器中。虽然它不中断主线程,这意味着它按预期运行,呈现所有内容,但它使任务成为";不响应";,这不允许我与最大化、关闭按钮、调整大小等交互。这是我的多线程代码。

public void Init()
{
Thread thread = new Thread(Loop);
thread.Start();
}
public void Loop()
{
while (true)
{
if (InvokeRequired)
{
this.BeginInvoke(new MethodInvoker(delegate { RenderFrame(); }));
}
if (maxFps > 0)
{
Thread.Sleep(1000 / maxFps);
}
}
}

如果有人知道我如何在不冻结进程的情况下或在不使用多线程的情况下获得相同的结果,请给我一些建议!!

编辑:我决定只使用计时器,它稍微慢一点,但我想这没关系。不过,它的最后一个问题是,有时当关闭或单击winform时,我的循环会结束,它会停止调用render函数。我使用的是:

var timer = new System.Threading.Timer((e) =>
{
this.BeginInvoke(new MethodInvoker(delegate { RenderFrame(); }));
}, null, 0, 1);

您正在启动一个线程,该线程只会用数百万条消息轰炸UI消息循环。这不是一个好的线程使用。当你有与UI无关的工作要做时,你需要一个后台线程,在你的情况下,所有的工作似乎都与操纵UI组件有关。所以所有的工作都应该发生在UI线程上。为了在无限循环运行时保持UI的响应性,可以将Loop转换为async方法(async Taskasync void(,并将Thread.Sleep()替换为await Task.Delay():

public void Init()
{
Loop();
}
public async void Loop()
{
while (true)
{
RenderFrame();
if (maxFps > 0)
await Task.Delay(1000 / maxFps);
else
await Task.Yield();
}
}

您可以检查主窗体仍然打开的条件,而不是while (true),否则在关闭窗体后循环将继续,很可能导致ObjectDisposedException

相关内容

最新更新