c# - 两个线程之间的交互

标签 c# multithreading

我正在开发一个 winform 应用程序,我的目标是让我的表单上的标签对用户可见,三秒钟后让标签不可见。这里的问题是超时三秒。老实说,我不知道这是否是解决我的问题的正确方法,但我能够通过创建一个新线程并让新线程休眠三秒钟来完成这项工作(System.Threading.Thread.Sleep(3000)) .

我不能使用 System.Threading.Thread.Sleep(3000) 因为这会使我的 GUI 卡住 3 秒!

private void someVoid()
{
     lbl_authenticationProcess.Text = "Credentials have been verified authentic...";

     Thread sleepThreadStart = new Thread(new ThreadStart(newThread_restProgram));
     sleepThreadStart.Start();

     // Once three seconds has passed / thread has finished: lbl_authenticationProcess.Visible = false;
}

private void newThread_restProgram()
{
     System.Threading.Thread.Sleep(3000);
}

所以,回到我最初的问题。我如何确定(从我的主线程)新线程何时完成,这意味着已经过去了三秒钟?

我对新想法持开放态度,而且我确信有很多。

最佳答案

现在,您正在阻塞整个 UI 线程,以便在 3 秒后隐藏标签。如果这就是您想要的,那么只需在表单中使用 Thread.Sleep(3000) 即可。如果没有,那么您最好使用 Timer:

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 3000;
timer.Tick += (s, e) => { this.lbl_authenticationProcess.Visible = false; timer.Stop(); }
timer.Start();

3 秒后,标签将消失。不过,在您等待期间,用户仍然可以与您的应用程序进行交互。

请注意,您必须使用 Timer 的表单版本,因为它的 Tick 事件是在 UI 线程上引发的,允许直接访问控制。其他计时器可以工作,但与控件的交互必须是Invoke/BeginInvoked。

关于c# - 两个线程之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7285999/

相关文章:

c++ - 如何休眠 APR 线程?

java - 如何让多个线程和类写入 Java 中的同一个日志文件?

C#初始化问题

c# - FreeAgent API (OAuth) 来自 c#

c# - 反序列化泛型类型

java - 避免返回 LIST 时可能出现的并发问题

python - Python中ThreadPoolExecutor上下文中的轻量级持久化

java - SwingUtilities.invokeLater 和 SwingWorker<Void, Object> 的区别?

c# - 如何读取已过期的 JWT token

c# - 从 asp.net 上的另一个文件夹引用 dotnetnuke.dll