如何暂停代码直到我想要?[类似Thread.Sleep(int);]
本文关键字:Thread 类似 Sleep int 何暂停 暂停 代码 我想要 | 更新日期: 2023-09-27 18:20:29
我认为表达我观点的最好方法是给你举以下例子:
Console.ReadLine();
Process.WaitForExit();
这些功能将暂停应用程序(而不冻结UI)。
我需要这样的东西。
事实上,我正在用windows forms applications
写一些类似ReadLine()
的东西
当您调用此方法时,应该等待,直到用户按下Enter。
您可以创建一个线程来等待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
,这些将由知道如何处理并订阅它们的逻辑类实例处理。