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

时间:2018-01-10 11:09:42

标签: c# multithreading visual-studio

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

    // *************************************
    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 :))

1 个答案:

答案 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
    }

这似乎有效。