我有一个自动邮件客户端应用程序,我需要显示一个"正在连接..."检索邮件期间的图片。
// *************************************
private void Form1_Load(object sender, EventArgs z)
{
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 20000;
aTimer.Enabled = true;
CheckMail();
}
// *************************************
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
CheckMail();
}
// *************************************
void CheckMail() {
SetPictureSwitch();
//picEmail.visible=true
{
// procedure to check mail and update Grid list....
}
SetPictureSwitch();
//(picEmail.visible=false)
}
// *************************************
// picEmail is a simple image with wait... icon
private void SetPictureSwitch()
{
if (picEmail.InvokeRequired)
{
picEmail.Invoke(new MethodInvoker(
delegate ()
{
picEmail.Visible = !picEmail.Visible;
}));
}
else
{
picEmail.Visible = !picEmail.Visible;
}
Application.DoEvents();
}
// *************************************
private void btnRefresh_Click(object sender, EventArgs e)
{
CheckMail();
}
我尝试了任何类型的线程管理,但没有成功,图片没有显示或收到"跨线程错误"。如果我只使用 btnRefresh,那么它可以正常工作。
在CheckMail(( 启动时使图片可见并在 CheckMail(( 完成时隐藏它的正确方法是什么?
为什么设置可见=真如此困难?(对不起,我来自VB6:)(
我相信
已经找到了一种不确定最佳解决方案。
// *************************************
private void Form1_Load(object sender, EventArgs z)
{
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 20000;
aTimer.Enabled = true;
CheckMail();
}
// *************************************
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
CheckMail();
}
// *************************************
void updatePic()
{
if (InvokeRequired)
{ Invoke(new MethodInvoker(switchPic)); }
else
{ switchPic(); }
}
// *************************************
void switchPic()
{
picEmail.Visible = !picEmail.Visible;
}
// *************************************
void CheckMail() {
updatePic(); // visible=true
{
// procedure to check mail and update Grid list (with another Invoke)
}
updatePic(); // visible=false
}
这似乎有效。