Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在GUI窗体和线程睡眠上设置一些内容_C# - Fatal编程技术网

C# 在GUI窗体和线程睡眠上设置一些内容

C# 在GUI窗体和线程睡眠上设置一些内容,c#,C#,我有一个GUI窗口窗体。我想将图像设置为pictureBox,然后再睡3秒钟 pictureBox.Image = image; Thread.Sleep( 3000 ); 但若我像上面的代码那个样做,我的表单会尝试设置图像,然后进入睡眠状态3秒钟,然后我的表单会自动绘制。所以我的照片在这3秒钟后显示出来。我如何设置图像,展示它,然后在“睡觉”之后呢 编辑1 确切地说,我想做这样的事情: 我有两个线程,UI和GUI。用户界面从网络套接字读取数据,并从用户界面调用正确的方法。可以是这

我有一个GUI窗口窗体。我想将图像设置为pictureBox,然后再睡3秒钟

   pictureBox.Image = image;
   Thread.Sleep( 3000 );
但若我像上面的代码那个样做,我的表单会尝试设置图像,然后进入睡眠状态3秒钟,然后我的表单会自动绘制。所以我的照片在这3秒钟后显示出来。我如何设置图像,展示它,然后在“睡觉”之后呢

编辑1
确切地说,我想做这样的事情:

我有两个线程,UI和GUI。用户界面从网络套接字读取数据,并从用户界面调用正确的方法。可以是这样的脚本:

  • GUI上的UI调用:设置映像
  • GUI上的UI调用:做点什么(然后GUI必须清除图像)
但我想确定,我能看到这张照片。所以,在GUI设置映像之后,我调用这个线程3秒钟。那么,我该怎么做呢

例如: (来自GUI的功能)

和其他功能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调用):

这是可行的,但不是最好的解决方案。如果脚本是这样的:

- UI call f1
- UI call f3
用户界面将休眠3秒,我不期望它

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

试试以下方法之一:

Form.Refresh ();
Application.DoEvents;


我假设是WindowsForms。

您不应该让GUI睡眠。至少不是你现在的样子。如果您使用
Thread.Sleep
或其他阻止机制,您将阻止UI执行它应该执行的操作;发送和处理消息

如果您真的想导致延迟操作,那么最好使用
System.Windows.Forms.Timer
。这是我认为你需要做的。这当然是基于我对你所说的“去睡觉”的模糊理解

  • 树立你的形象
  • 然后立即禁用模拟“进入睡眠”对您意味着什么的所有必要控件
  • 然后启动计时器
  • 最后在
    勾选
    事件中添加代码,逆转“进入睡眠”对您意味着什么

将此.Refresh()置于睡眠前。这不是最好的解决方案,但应该有效。哪个选项有效?(供未来读者阅读)。[此外,通过接受答案,您可以让其他人知道他们不需要回复。]重新绘制整个表单和所有控件没有什么意义。pictureBox.Update()是最好的。这是最糟糕的。更糟糕的是。@agent-j:这个选项行得通,这篇文章是第一篇。对我的问题的评论是在这篇文章之后添加的。这个.Refresh()可以工作,也可以工作:Form.Refresh();应用程序.DoEvents@Hans Passant-pictureBox.Update()也可以工作。谢谢,我使用这个选项。对,DoEvents允许处理所有用户操作。包括她关闭表单,让代码在没有UI的情况下运行。这通常会在ObjectDisposedException上崩溃。我正想做这样的事情:我有两个线程,UI和GUI。用户界面从网络套接字读取数据,并从用户界面调用正确的方法。可以是这样的脚本:-UI-call-on-GUI:set-image-UI-call-on-GUI:do-something(然后GUI必须清除图像),但我想确定,我将能够看到这个图像。所以,在GUI设置映像之后,我调用这个线程3秒钟。那么,我该怎么做呢?附:我如何在评论中添加新行?@nirmus:继续,用这些附加信息编辑你的答案。事实上,你正在使用另一个线程可能会从根本上改变我的答案。如果你提供更多的细节,我们可能会提供更多的帮助。
- UI call f1
- UI call f3
Form.Refresh ();
Application.DoEvents;