Hoi,
Misschien is de titel niet helemaal duidelijk maar ik zal proberen uit te leggen wat ik probeer.
Ik heb een System.Threading.Timer die een stukje code uitvoert (zoals de documentatie zegt op een aparte threadpool thread).
Deze code loopt in een service en er worden meerdere van deze "tasks" gestart met hun eigen interval.
Deze tasks bestaan uit losse "plugins" die aan een bepaalde interface voldoen.
De Timer maakt een Task aan (De plugin) en callt de Run() method van deze task.
Nu kan het zijn dat een task te lang duurt. Nu wil ik dus de Run() onderbreken. Ik kom echter al snel uit op een thread.Abort() of een Timer.Dispose() maar dat is niet echt netjes begrijp ik.
Even wat code om het een en ander te verduidelijken
Creeren van een task:
Het Task object
En een voorbeeld Task assembly met de run method die afgebroken dient te worden.
Is het mogelijk wat ik wil of moet ik toch iets met thread.abort gaan doen?
Misschien is de titel niet helemaal duidelijk maar ik zal proberen uit te leggen wat ik probeer.
Ik heb een System.Threading.Timer die een stukje code uitvoert (zoals de documentatie zegt op een aparte threadpool thread).
Deze code loopt in een service en er worden meerdere van deze "tasks" gestart met hun eigen interval.
Deze tasks bestaan uit losse "plugins" die aan een bepaalde interface voldoen.
De Timer maakt een Task aan (De plugin) en callt de Run() method van deze task.
Nu kan het zijn dat een task te lang duurt. Nu wil ik dus de Run() onderbreken. Ik kom echter al snel uit op een thread.Abort() of een Timer.Dispose() maar dat is niet echt netjes begrijp ik.
Even wat code om het een en ander te verduidelijken
Creeren van een task:
C#:
1
2
3
4
5
6
7
8
9
10
| Task task = new Task(settings); TimerCallback timerDelegate = new TimerCallback(task.Run); AutoResetEvent autoResetEvent = new AutoResetEvent(false); System.Threading.Timer timer = new System.Threading.Timer(timerDelegate, autoResetEvent, settings.Interval, settings.Interval); _scheduledTasks.Add(task.Settings.SiteName + task.Settings.TaskName, task); |
Het Task object
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| private ITask _taskHandler; public Task(TaskSettings settings) { //laad task assembly Assembly ass = Assembly.LoadFrom(settings.AssemblyLocation); Type type = ass.GetType(settings.ClassName); _taskHandler = (ITask)Activator.CreateInstance(type); } public void Run(object state) { try { if (_taskHandler.Enabled) { if (!_taskHandler.Busy) { // run task in assembly _taskHandler.Run(); } else { //hij is te lang bezig // stop het executen van _taskHandler.Run()... maar hoe? } } } catch (Exception ex) { //log fatal } } |
En een voorbeeld Task assembly met de run method die afgebroken dient te worden.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public void Run() { try { //de code die hier uitgevoerd word // zou gestopt moeten worden als de service vind dat het te lang duurt } catch(Exception ex) { } finally { } } |
Is het mogelijk wat ik wil of moet ik toch iets met thread.abort gaan doen?
[ Voor 3% gewijzigd door 4of9 op 14-10-2008 15:02 ]
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...