Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] Throw exception in OnTimedEvent

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een class (Class1) die 1 methode heeft (VoerUit).
In deze class maak ik een instantie naar een tweede class (Class2), die een heleboel methodes heeft.
1 van deze methodes is een langdurig proces (RunLang).
Ik wil dat dit proces niet langer duurt dan 1 minuut, dan moet een exception gegeven worden.
Ik heb hiervoor in Class2 een Timer toegevoegd met een OnTimedEvent

Globaal ziet mijn code er zo uit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Class1
{
  private Class2 class2;

  public void VoerUit()
  {
    try
    {
      this.class2 = new Class2();

      this.class2.RunLang();  
    }
    catch(Exception ex)
    {
      Log(ex.Message())
    }
    finally
    {
      // Ready:
      this.class2.EndScript();
    }
  }
}


De methode RunLang doet een aantal acties in een loopje.
Na elke actie schrijft die wat weg in een log file.

De OnTimedEvent logt ook en doet een throw new Exception();

Als ik de logfile bekijk, zie ik de acties van RunLang, dan de log van de OnTimedEvent en vervolgens weer de acties.
Het event wordt dus wel getriggerd, maar de exception zorgt er niet voor dat ik in mijn catch van Class1 terecht kom, terwijl dat wel de bedoeling is.

Kan iemand me even een zetje geven hoe ik dit moet oplossen?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:05

Janoz

Moderator Devschuur®

!litemod

Het lijkt me handiger wanneer je juist (ook) even de code van RunLang laat zien. Anders is er eigenlijk weinig over te zeggen.

Ik vermoed dat het timed event in een andere thread uitgevoerd wordt waardoor de exception dus helemaal niet in dezelfde stack naar boven gegooit wordt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Janoz schreef op maandag 04 april 2011 @ 13:45:
Het lijkt me handiger wanneer je juist (ook) even de code van RunLang laat zien. Anders is er eigenlijk weinig over te zeggen.

Ik vermoed dat het timed event in een andere thread uitgevoerd wordt waardoor de exception dus helemaal niet in dezelfde stack naar boven gegooit wordt.
Afhankelijk van welke Timer klasse je gebruikt is dat precies wat er gebeurd. Als je wilt dat je exception op de thread wordt uitgevoerd die de timer gestart heeft dan moet je met thread invoke werken.

Maargoed, dan nog gaat dit afaik nog niet werken. Stel dat je timer een exception gooit op de thread welke hem aanroept, dan vind deze exception alsnog niet plaats in de scope van de methode welke je wilt limiteren.

Edit: Om dit te kunnen bewerkstelligen zou je iets met Thread.Join kunnen doen.

[ Voor 4% gewijzigd door D-Raven op 04-04-2011 14:22 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kunt inderdaad niet zomaar ergens anders een Exception gooien. Je wil dat de Exception in je RunLang gegooid word, en dus zul je er daar ook support voor moeten inbouwen

Als ik jou was zou ik eens hier kijken: MSDN: Task Cancellation

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Bedankt allen.
Mijn eigen code gebruikt geen nieuwe threads, maar mijn code wordt in een script editor van een andere applicatie gedraaid. Waarschijnlijk gebruikt die wel andere threads. Ik zal daar eens naar kijken.
Het zou wel verklaren waarom de exception in mijn event niet werkt.
Ik zal ook naar Thread.Join kijken.
Die task cancellation ziet er ook goed uit, alleen ben ik gebonden aan .NET v3.5

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Met deze keywords vond ik redelijk wat relevante onderwerpen.

Edit: Tinyurl links naar lmgtfy worden niet gewaardeerd!

[ Voor 113% gewijzigd door Woy op 04-04-2011 15:47 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op maandag 04 april 2011 @ 15:25:
Die task cancellation ziet er ook goed uit, alleen ben ik gebonden aan .NET v3.5
Je kan iets dergelijks natuurlijk ook zelf redelijk eenvoudig implementeren ( Het hoeft niet veel complexer dan een Boolean "CancellationRequested" te zijn. Je moet alleen even rekening houden met thread-safety ). Je zou bijvoorbeeld ook kunnen overerven van BackgroundWorker, daar zit ook Cancellation support in.

Het komt er op neer dat je in je long running methode af en toe moet checken of er de taak cancelled is of niet. Anders zul je moeten gaan werken met het Aborten van threads, maar dat is eigenlijk niet echt aan te raden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Ik zat ook al even te denken aan een boolean.

Ik zal het eens uitzoeken.
Pagina: 1