Laden...

Timer Probleme

Erstellt von schillerdeluxe vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.402 Views
S
schillerdeluxe Themenstarter:in
138 Beiträge seit 2006
vor 16 Jahren
Timer Probleme

Hey!

Ich verwende in meinem Source einen Timer und wenn der abläuft also elapsed kommt eine unschöne Fehlermeldung, welche ich nicht ganz verstehe, und zwar:

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

Weißt jemand warum diese Exception geschmissen wird?

5.742 Beiträge seit 2007
vor 16 Jahren

Hallo,

wie sieht denn dein Code aus?

Verwendest du mehrere Threads?

Welchen Timer verwendest du?

S
schillerdeluxe Themenstarter:in
138 Beiträge seit 2006
vor 16 Jahren

Nein, das ist der einzige Thread den ich verwende


using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Shapes;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Timers;


namespace TeamSuite_Chat_Client
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>

    public partial class Window1 : Window
    {
        TeamSuite_Chat_Client.ServiceReference.InstantMessageClient imc = new TeamSuite_Chat_Client.ServiceReference.InstantMessageClient();
        TeamSuite_Chat_Client.ServiceReference.MessageInformation mi = new TeamSuite_Chat_Client.ServiceReference.MessageInformation();
        TeamSuite_Chat_Client.ServiceReference.Receiver r = new TeamSuite_Chat_Client.ServiceReference.Receiver();
        TeamSuite_Chat_Client.ServiceReference.MessageStatus ms = new TeamSuite_Chat_Client.ServiceReference.MessageStatus();
        TeamSuite_Chat_Client.ServiceReference.Messages m = new TeamSuite_Chat_Client.ServiceReference.Messages();
               
        Timer t = new System.Timers.Timer();

        

        public Window1()
        {
            InitializeComponent();
            t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
            t.Interval = 3000;
              
        }
        
        

       public void t_Elapsed(object source, ElapsedEventArgs e)
        {

            try
            {
                r.UserID = Convert.ToInt32(textBox3.Text);
                m.Message = imc.GetMessage(r).Message;
                label1.Content = m.Message;
            }

            catch (Exception ex) 
            {
                
                MessageBox.Show(ex.Message);
            }
        }

    }
}



49.485 Beiträge seit 2005
vor 16 Jahren

Hallo schillerdeluxe,

klingt nach [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke). Verwende besser System.Windows.Forms.Timer.

herbivore

A
65 Beiträge seit 2007
vor 16 Jahren

Hallo schillerdeluxe!

Vorm gleichen Problem stand ich vor ein paar Tagen.
Soweit ich weiß, laufen die Timer immer in einem eigenen Thread. Um im elapsed-ereignis auf Objekte anderer Threads zugreifen zu können (bei mir wars ein Control in meinem GUI), musst du das timer.SynchronisingObject auf deinen aktuellen thread festlegen.
Also quasi t.SynchronizingObject = this

Gruß, Andi