在GUI表单上设置一些内容并让线程休眠

问题描述

|| 我有一个GUI窗口形式。我想将图像设置为pictureBox,然后下次睡眠3秒。
   pictureBox.Image = image;
   Thread.Sleep( 3000 );
但是,如果我像上面的代码那样进行操作,则我的表单将尝试设置图像,然后进入睡眠状态3秒钟,然后我的表单便会自动绘制。所以我的图片在这3秒后显示。如何设置图像,显示图像并在“进入睡眠状态”之后显示? 编辑1 我确实想做这样的事情: 我有两个线程,UI和GUI。 UI从网络套接字读取,并从GUI调用权限方法。可以是这样的脚本: 在GUI上进行UI调用:设置图片 在GUI上进行UI调用:执行某项操作(然后GUI必须清除图像) 但我想确定,我将能够看到此图像。因此,在GUI设置图像之后,我将此线程调用3秒钟。那么,我该怎么办呢? 例: (来自GUI的功能
public void f1() {
     MethodInvoker method = () => {
            pictureBox.Image = image;
            pictureBox.Update();
           // do something more
     };

     if ( Invokerequired ) {
           Invoke( method );
     } else {
           method();
     }

 }

public void f2() {
     MethodInvoker method = () => {
            pictureBox.Image = null;
            pictureBox.Update();
           // do something more
     };

     if ( Invokerequired ) {
           Invoke( method );
     } else {
           method();
     }

 }
和其他函数f3 ... fn
 public void f3() {
     MethodInvoker method = () => {
           // do something 
     };

     if ( Invokerequired ) {
           Invoke( method );
     } else {
           method();
     }

 }
而且,我是我的UI线程调用函数f1,在它之后是f2,我想确保我的用户能够看到此图片。但是,如果我的UI线程调用函数f1和f3..fn之间的某个函数正常调用它。 编辑2 不,我做到了: 我以GUI形式定义功能(由UI调用):
  public void f1() {
         MethodInvoker method = () => {
                pictureBox.Image = image;
                pictureBox.Update();
         };

         MethodInvoker method2 = () => {
                // something
         }

        if ( Invokerequired ) {
                Invoke( method );
                Thread.Sleep( 3000 );  // sleep UI thread
                Invoke( method2 );
        } else {
                method();
                method2();
        }
  }
它有效,但不是最佳解决方案。如果将是这样的脚本:
- UI call f1
- UI call f3
UI会休眠3秒钟,我没想到。 什么是我的问题的最佳解决方案?     

解决方法

        尝试以下方法之一:
Form.Refresh ();
Application.DoEvents;
Application.DoEvents 我假设使用WindowsForms。     ,        您绝对不应让GUI进入睡眠状态。至少不是您的做法。如果使用“ 6”或其他阻止机制,则将阻止UI进行应做的事情;调度和处理消息。 如果您确实想延迟动作,那么最好使用
System.Windows.Forms.Timer
。我认为这是您需要做的。这当然是基于我对“睡觉”的含糊理解。 设置您的图像。 然后立即禁用所有必要的控件,这些控件对您模拟“去睡觉”的含义。 然后启动计时器。 最终,在“ 8”事件中,添加了代码,以对您“转入睡眠”的含义进行反转。