在GUI表单和线程睡眠上设置一些东西

时间:2011-06-14 22:06:50

标签: c#

我有一个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

用户界面将睡3秒钟,我不指望它。

我的问题的最佳解决方案是什么?

2 个答案:

答案 0 :(得分:3)

你永远不应该让你的GUI睡觉。至少不是你的方式。如果您使用Thread.Sleep或其他阻止机制,您将阻止UI执行它想要执行的操作;调度和处理消息。

如果你真的想引起延迟行动,那么你最好使用System.Windows.Forms.Timer。这是我认为你需要做的。这当然是基于我对“入睡”的含义的模糊理解。

  • 设置图片。
  • 然后立即禁用所有必要的控件,模拟“进入睡眠状态”对你意味着什么。
  • 然后启动计时器。
  • 最后在Tick事件中添加代码以反转任何“进入睡眠状态”对您而言意味着什么。

答案 1 :(得分:2)

尝试以下方法之一:

Form.Refresh ();
Application.DoEvents;

Application.DoEvents

我假设是WindowsForms。