问题描述
||
我有一个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”事件中,添加了代码,以对您“转入睡眠”的含义进行反转。