[c#] events die niet goed gaan

Pagina: 1
Acties:

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Ik heb een applicatie met 3 threads
thread1 is de hoofdthread, deze start thread2 en 3
thread2 is een thread die on de zoveel tijd in een databse kijkt of er veranderingen zijn, als dat het geval is komt er een event. Dit event wordt in thread1 afgevangen alsvolgt:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
private void DeviceInformationChanged(object source, LocationChangedEventArgs e)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new LocRecords.LocationChangedEvent(DeviceInformationChanged), new object[] { source, e });
                return;
            }

            speaker.AddQueue("tell me something");
            

        }

speaker is thread3, deze heeft een queue met zinnen die uitgesproken moeten worden. Nu als er iets verandert in de database komt "tell me something" uit de luidsprekers. Mooi dacht ik. Het vervolg een zin met wat meer inhoud:

event handler aangepast:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
private void DeviceInformationChanged(object source, LocationChangedEventArgs e)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new LocRecords.LocationChangedEvent(DeviceInformationChanged), new object[] { source, e });
                return;
            }

            speaker.AddQueue(this.GetSentence(e.oldLocation, e.newLocation, e.owner, e.device));
            

        }

Getsentence haalt info op uit de database (naam, lokatie, etc.) bouwt hier een zinnetje van en stuurt deze terug.

Nu krijg ik de fout:
An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll

Additional information: Exception has been thrown by the target of an invocation.
Ik heb gevolg dat het komt dat het event sneller aangeroepen wordt dan dat GetSentence een zin kan bouwen.
Ik heb geprobeerd er een lock(this){ } om speaker.AddQueue te zetten maar dat werkte niet. (speaker is een thread de implementatie van addqueue:
C#:
1
2
3
4
5
6
7
 public void AddQueue(String str)
        {
            lock (speakQueue)
            {
                speakQueue.Enqueue(str);
            }
        }
)

en de speaker thread (ter info):
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void threadFunction()
        {
            SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
            SpVoice Voice = new SpVoice();
            Voice.Voice = Voice.GetVoices("name = microsoft mary", null).Item(0);
            while (true)
            {
                lock (speakQueue)
                {
                    if (speakQueue.Count != 0)
                    {
                        String str = (String)speakQueue.Dequeue();
                        Voice.Speak(str, SpFlags);
                        
                    }
                    else
                    {
                        Thread.Sleep(2000);
                    }
                }
            }
        }


Waar komt deze fout vandaan en hoe kan ik hem oplossen?

Shit, gevonden:
Ik had in mijn getsentence een fout geknutseld, deze komt zo terug, ik keek alleen op de verkeerde plaats aangezienin de mthod los wel goed getest heb, alleen had ik wat veranderd..... 8)7

[ Voor 19% gewijzigd door elgringo op 08-03-2007 10:54 ]

if broken it is, fix it you should


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Als je nou gewoon eens kijkt wat voor exception er dan door je target gethrowed wordt?
Dus ff dit doen:
C#:
1
2
3
4
5
6
7
8
9
if (this.InvokeRequired)
{
    try {
        this.BeginInvoke(new LocRecords.LocationChangedEvent(DeviceInformationChanged), new object[] { source, e });
        return;
    } catch(TargetInvocationException tix) {
        System.Diagnostics.Debug.WriteLine(tix.InnerException.ToString());
    }
}

en dan verder analyseren en kijken wat er fout gaat. Of nog beter gewoon een try/catch om je GetSentence() heen want daar zal de tix.InnerException over mekkeren.

Nu met Land Rover Series 3 en Defender 90


  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Wat gebeurt er precies in this.GetSentence? Misschien gaat daar iets niet helemaal goed?

[ Voor 6% gewijzigd door eek op 08-03-2007 10:46 ]

Skill is when luck becomes a habit.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
eek schreef op donderdag 08 maart 2007 @ 10:45:
Wat gebeurt er precies in this.GetSentence? Misschien gaat daar iets niet helemaal goed?
daar zat idd de fout, foutje met copy paste aangezien de methode los wel werkte, hierna een fout in geslopen (database was niet open), nu werkt ie wel

if broken it is, fix it you should