在其他过程中更改图片可见状态



我有一个自动邮件客户端应用程序,我需要显示一个"正在连接..."检索邮件期间的图片。

    // *************************************
    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
    }

这似乎有效。

最新更新