Adam R.
Adam R.

Reputation: 9

I want to use BackgroundWorker to speed up my graphical appearances

I am writing a Kiosk-type program for a media center PC. I have some pictureBoxes as my buttons, and would like a label or another pictureBox (acting as a label) to be visible/not visible and be triggered by a MouseEnter and MouseLeave event.

When the MouseLeave event happens(triggering Visible=false), a white box appears in place of the pictureBox or label that was previously there for a split second until the background image fills back in.

I have read up a little bit on using the BackgroundWorker to "pre-load" my pictureBox or labels. I am not sure that i am doing it right. I am very new to programming; i dabble here and there, and do not have any formal training in c#.

I am not looking for anyone to write the code for me, but i also am not objected to that either. A simple example of how to use it should suffice.

I have a background image (1920x1080) on my form. I think this image is actually having a harder time refreshing after the label or pictureBox's visibility is set to false.

private void pictureBox1_MouseEnter(object sender, EventArgs e)
        {
                     this.pictureBox9.Visible = true;
        }
private void pictureBox1_MouseLeave(object sender, EventArgs e)
        {
            this.pictureBox9.Visible = false;
        }

I am attempting to use the backgroundWorker DoWork event, but really have no idea what i am doing.

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
            this.pictureBox9.Visible = true;
            this.pictureBox9.Visible = false;
    }

My question is, "How do i use backgroundworker to effectively reduce the lag caused by changing visibilty of my pictureBoxes or lables?

Upvotes: 0

Views: 574

Answers (2)

I do not recommend using BackgroundWorker for this because the fact of changing the Visibility of a Visual Element requires the Main Thread and not a Worker Thread. What I recommend in any case is to handle the Opacity so you don't have to load the image again.

Upvotes: 1

Mr. B
Mr. B

Reputation: 2975

The BackgroundWorker works like this:

    BackgroundWorker workerOne = new BackgroundWorker();
    BackgroundWorker workerTwo = new BackgroundWorker();
    private void MyForm_Load(object sender, EventArgs e)
    {
        workerOne.DoWork += workerOne_DoWork;
        workerTwo.DoWork += workerTwo_DoWork;
    }
    private void ThingOne_Click(object sender, EventArgs e)
    {
        workerOne.RunWorkerAsync();
    }
    private void ThingOne_Click(object sender, EventArgs e)
    {
        workerTwo.RunWorkerAsync();
    }
    void workerOne_DoWork(object sender, DoWorkEventArgs e)
    {
        //This will run as async and not interupt main thread
    }
    void workerTwo_DoWork(object sender, DoWorkEventArgs e)
    {
        //This will run as async and not interupt main thread
    }

I've included two in the example. Basically the RunWorkerAsync breaks it off in its own thread.

Upvotes: 2

Related Questions