gpt4 book ai didi

c# - 使用 RichTextBox 在 Text Appends 中创建延迟

转载 作者:行者123 更新时间:2023-11-30 22:20:26 26 4
gpt4 key购买 nike

我正在尝试使用 C# 创建一个逼真的控制台类型游戏,我需要它做的是附加如下文本:

hi
hello
awesome
nice

但我希望它这样做,而不是一次全部执行:

hi
(2 second pause)
hello
(4 second pause)
awesome
(1 second pause)
nice

我试过这个:

delegate void _pause(int time);
void pause(int time)
{
if (txtInput.Text != "")
{
txtInput.Clear();
}

Stopwatch s = new Stopwatch();
s.Start();
while (s.Elapsed < TimeSpan.FromSeconds(time))
{
}
s.Stop();
return;
}

然后我可以像这样调用它 Invoke(new _pause(pause),3); 但这基本上会卡住线程!所以无论如何它都会一次粘贴,只是之前的延迟粘贴的蒙太奇!

我怎样才能像我描述的那样做一个平滑的延迟类型系统?

最佳答案

您应该避免忙等待,而是使用计时器,例如 Task.Delay .

一种可能的方法是利用 C# 4.5 的新异步功能:

async void converse() {
txtInput.Text = "hi\n";
await Task.Delay(2000);
txtInput.Append("hello\n");
await Task.Delay(4000);
txtInput.Append("awesome\n");
await Task.Delay(1000);
txtInput.Append("nice\n");
}

通过使用异步语法,您可以指示机器运行您的代码与其他代码交错运行 - 例如,这样它仍然可以同时进行屏幕更新。它会自动返回到相同的 SynchronizationContext,因此在您的情况下,因为您是在 GUI 线程上启动的,所以您将继续使用它;这很重要,因为只有该线程可能会更改您的文本框。

总结一下为什么你想像这样这样做:

  • 您可以避免占用 CPU 的忙等待浪费能源。
  • 避免阻塞 GUI 线程,这样您的更新就会按时出现(不像 CPU 占用,也不像 Thread.Sleep,例如)
  • 您不必特别担心线程调度,因为异步功能会为您完成。

如果您需要支持 .NET 2.0,您可能需要查看 Windows 窗体 Timer .简而言之,这会公开事件处理程序,您可以在延迟后触发这些事件处理程序。但是,正如 MSDN 页面上的示例所示,它并不那么容易使用,并且需要更多的手动编排。

此外,您可以使用线程。如果这样做,您有责任确保线程安全:您不得在 GUI 线程以外的任何线程上执行 txtInput.Append:

void startConversation() {
(new Thread(converse) {IsBackground = true}).Start();
}
void converse() { //called a different thread
UI(() => txtInput.Text = "hi\n");
Thread.Sleep(2000);
UI(() => txtInput.Append("hello\n"));
Thread.Sleep(4000);
UI(() => txtInput.Append("awesome\n"));
Thread.Sleep(1000);
UI(() => txtInput.Append("nice\n"));
}
void UI(Action action) { this.BeginInvoke(action); }

这个模型几乎和异步模型一样简单。两个陷阱是您应该避免忙等待(使用 Thread.Sleep),并且您必须确保对所有影响 UI 的代码正确使用 BeginInvoke。它甚至可能比 async 快一点。但是,线程具有相当大的开销(主要是内存方面),因此该解决方案不会扩展到大量延迟交互。

总结

  • 如果可以,请使用async
  • 或者,使用 Windows 窗体 Timer,这很麻烦。
  • 或者使用后台线程 - 但要注意扩展问题和繁忙的等待。

关于c# - 使用 RichTextBox 在 Text Appends 中创建延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14998679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com