如何暂停代码直到我想要?[类似Thread.Sleep(int);]

本文关键字:Thread 类似 Sleep int 何暂停 暂停 代码 我想要 | 更新日期: 2023-09-27 18:20:29

我认为表达我观点的最好方法是给你举以下例子:

Console.ReadLine(); 
Process.WaitForExit();

这些功能将暂停应用程序(而不冻结UI)。

我需要这样的东西。

事实上,我正在用windows forms applications写一些类似ReadLine()的东西
当您调用此方法时,应该等待,直到用户按下Enter

如何暂停代码直到我想要?[类似Thread.Sleep(int);]

您可以创建一个线程来等待AutoResetEvent,UI线程应该继续并接受发出事件信号的输入。

Console应用程序没有UI,因此没有什么可以冻结的WaitForExit()。在控制台应用程序中,chrome(标题栏和窗口按钮)由系统处理。在WinForms应用程序中,只有将NC_PAINT事件传递给默认处理程序后,才会绘制这些内容。如果你的主消息循环正在休眠,那么你的chrome就不会被绘制。

WinForms应用程序不会自动关闭,因此没有理由调用类似WaitForExit()的程序。相反,你会明确告诉应用程序何时关闭,比如用户按下escape或其他什么键。

您可以使用backGroundWorker,它只需使用Thread.Sleep(100)检查取消并等待一段时间。

另一种方法是创建自己的线程,并自己控制所有的检查和回调。

试试这个

Task logManager = Task.Factory.StartNew(() => {   /* Your code */ }, TaskCreationOptions.LongRunning);

甚至

Task screenshotManager; 
     private void StartScreenshotManager()
            {
                screenshotManager = Task.Factory.StartNew(() => { ScreenshotManagerJob(); }, TaskCreationOptions.LongRunning);
                screenshotManager.ContinueWith((t) => { ScreenshotManagerUpdateUI(); }, TaskScheduler.FromCurrentSynchronizationContext());
            }
            private void ScreenshotManagerUpdateUI()
            {
                // ... UI update work here ... 
            }
            private void ScreenshotManagerJob()
            {
             // your code
             }

很可能,您根本不需要在Windows窗体应用程序中停止执行。

Windows窗体应用程序通常需要更加一致的体系结构。如果在用户输入后需要一些代码继续执行,则不应停止函数执行。相反,打开一个对话框(或为用户提供任何其他方式来进行所需的输入),然后等待他"与之交互"。交互应该引发C#event,这些将由知道如何处理并订阅它们的逻辑类实例处理。