0

我目前正在制作一个基于文本的游戏,但我需要调用暂停一定的毫秒数。我正在寻找这样的东西:

void InitProgram()
{
   WriteToText("Welcome!");
   CreatePause(3000); // Pause execution HERE for 3 seconds without locking UI
   WriteToText("How are you?"); // Continue
   StartTutorial();
}

就像,方法将被调用,做它等待的事情,然后返回。当它返回时,继续正常执行。我可以为这个效果做些什么?

4

4 回答 4

2

您可以使用计时器:

readonly Timer _timer = new Timer();

void InitProgram()
{    
    WriteToText("Welcome!");

   _timer.Interval = 3000;
   _timer.Tick += timer_Tick;
   _timer.Start();
}


void timer_Tick(object sender, EventArgs e)
{
    WriteToText("How are you?"); // Continue
    StartTutorial();

    _timer.Stop();
}

如果您想多次调用它,只需将 _timer.Start 放入它自己的方法中,每次调用它,3 秒后 timer_Tick 中的任何内容都会发生:

private void StartTimer()
{
    _timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
    WriteToText("How are you?"); // Continue
    StartTutorial();

    _timer.Stop();
}
于 2013-10-29T10:17:51.447 回答
1

如果目标框架是 4.0 或更高版本,IDE 是 VS2012 或更高版本,则可以使用 async/await

    private async void Foo()
    {
        Console.WriteLine("Going to Await");
        await Task.Delay(5000);
        Console.WriteLine("Done with awaiting");
    }

它非常简单明了,最大的优点是保留了“线性”流程,因为编译器会自动处理必要的回调等。

于 2013-10-29T10:25:02.767 回答
0

这样的事情怎么样?

都是伪代码,没测试过。。。

Thread _thread;

void InitProgram()
{
   WriteToText("Welcome!");

   ThreadStart ts = new ThreadStart(StartThread);
   _thread = new Thread(ts);
   _thread.Start();
}

private void StartThread()
{
    Thread.CurrentThread.Sleep(3000);
    this.Invoke(delegate { this.StartTutorial(); });
}

private void StartTutorial()
{
   WriteToText("How are you?"); // Continue

   //Start tutorial
}
于 2013-10-29T10:19:14.083 回答
0

哈哈哈哈!我用可能是最疯狂的方法找到了答案!看看这个,伙计们!

首先,声明全局List:

private List<Action> actionList = new List<Action>();

现在,这就是您在希望从中调用 wait 的方法中所做的:

WriteToLog("Hello!"); 
Action act = delegate() { WriteToLog("How are you?"); }; actionList.Add(act); // Create a new Action out of this method and add it to the action list!
CreatePause(3000); // Call the method with your specified time

void CreatePause(int millisecondsToPause)
    {
        Action w = delegate() { Thread.Sleep(millisecondsToPause); };
        for (int i = 0; i < actionList.Count; i++) // Iterate through each method in the action list that requires attention
        {
            Action a_Instance = (Action)actionList[i]; // Add a cast to each iteration
            AsyncCallback cb = delegate(IAsyncResult ar) { Invoke(a_Instance);  w.EndInvoke(ar); };   // Do each method!!!!
            w.BeginInvoke(cb, null);
        }
        actionList.Clear();  // Clear that list!
        return; // Return!
    }

老实说,这不应该起作用,但它确实起作用。

于 2013-10-29T11:10:16.787 回答