我有一个自动邮件客户端应用程序,我需要在检索邮件期间显示“正在连接...”图片。
// *************************************
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()完成时隐藏它?
为什么设置visible = true如此困难? (对不起,我来自VB6 :))
答案 0 :(得分:0)
我相信找到了一种不确定最好的解决方案。
// *************************************
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
}
这似乎有效。