//I want to start a thread that set postion of a la lable here is part of the code

     t = new Thread(bar);

            t.Start();

public void bar()
        {
            while (true)
            {


                label2.Location = new Point(this.label2.Location.X + 10, this.label2.Location.Y);
                Thread.Sleep(1000);
                if (this.label2.Location.X > this.Width)
                {
                    label2.Location = new Point(200-this.label2.Width + 10, this.label2.Location.Y);
                }
            }
        }

//here is the problem
//Invalid cross-thread operation: Control 'Form1' has been accessed from a thread other than the one on which it was created.

Edited 2 Years Ago by Dziri_1: fault

As Momerath said, you'll need to Invoke the control if you want to update a control from a thread other than the UI thread, however one alternative (depending on what work you're wanting to do in this other thread) may be to simply launch the function that does the work asynchronously.

instead of

public void MyUIFunction()
{
    Thread t = new Thread( new ThreadStart( bar ) );
    t.Start();
}

public void bar()
{
    txtOuput.Text += "OutputText";
}

try

public void MyUIFunction()
{
    bar();
}

public async Task bar()
{
    txtOuput.Text += "OutputText";
}

See http://msdn.microsoft.com/en-us/library/hh191443.aspx for more information

Don't you need delegate void for this? like this:

public delegate void ControlLocation(Control control, Location loc); 

public void SetLocation(Control control, Location loc) {
    if (control.InvokeRequired) {
        control.Invoke(new ControlLocation(SetLocation), new object[]{control, loc}); 
    } else {
        control.Location=loc;      
    }
}

Or am I mistaken?

Edited 2 Years Ago by SynThiicQ: Non

SynThiicQ, that would be invoking which is the solution Momerath offered. With my example you do not need to invoke manually as the .NET framework takes care of it for you (:

This article has been dead for over six months. Start a new discussion instead.