Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The Calling thread cannot access this object because a different thread owns it - WPF [duplicate]

I have hardware which is connected through socket.

I have to check whether the hardware is connected or not every 5 seconds, which is indicated by a checkbox.

I have implemented a function:

private static System.Timers.Timer aTimer;
public MainWindow()
{
    InitializeComponent();
    client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);
    aTimer = new System.Timers.Timer();
    aTimer.AutoReset = true;
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    aTimer.Interval = 2000;
    aTimer.Enabled = true;
}

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    if (client.Connected == true)
    {
        Console.WriteLine("Not Connected");
        CheckBox.IsChecked = false;
    }
    else
    {
        Console.WriteLine("Connected");
        CheckBox.IsChecked = false;
    }
}

But when I am running the application it is throwing error:

The calling thread cannot access this object because a different thread owns it.

I researched and learned about Dispatcher.Invoke, but not been able to implement that in my code.

like image 400
Vivek Saurav Avatar asked Jan 23 '14 11:01

Vivek Saurav


1 Answers

A ui elememt can only be accessed by one UI Thread. CheckBox Requires UI Thread and your timer runs on different thread. Simple code to use Dispatcher

if (client.Connected == true)
{
    Dispatcher.Invoke(()=> {
        // Code causing the exception or requires UI thread access
        CheckBox.IsChecked =true;
    });
}

OR

if (client.Connected == true)
{
    Dispatcher.Invoke(new Action(()=> {
        // Code causing the exception or requires UI thread access
        CheckBox.IsChecked =true;
    }));
}

if you receive error An object reference is required for the non-static field, method, or property then use this

 Application.Current.Dispatcher.Invoke(() =>
 {
     // Code causing the exception or requires UI thread access
 });
like image 81
Mujahid Daud Khan Avatar answered Nov 16 '22 00:11

Mujahid Daud Khan