我有一个GUI窗口表单。我想将图像设置为pictureBox,然后下一次睡3秒。
pictureBox.Image = image;
Thread.Sleep( 3000 );
但是,如果我像上面的代码一样,我的表单会尝试设置图像,然后再进入睡眠状态3秒钟,然后我的表单会自行绘制。所以我的照片显示在这3秒之后。如何设置图像,显示图像,然后“进入睡眠状态”?
我有两个线程,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之间正常调用它。
不,我是这样说的: 我以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秒钟,我不指望它。
我的问题的最佳解决方案是什么?
答案 0 :(得分:3)
你永远不应该让你的GUI睡觉。至少不是你的方式。如果您使用Thread.Sleep
或其他阻止机制,您将阻止UI执行它想要执行的操作;调度和处理消息。
如果你真的想引起延迟行动,那么你最好使用System.Windows.Forms.Timer
。这是我认为你需要做的。这当然是基于我对“入睡”的含义的模糊理解。
Tick
事件中添加代码以反转任何“进入睡眠状态”对您而言意味着什么。答案 1 :(得分:2)