Reputation: 1388
public class DHSApi
{
public void StartFetchingTickerInfo()
{
client = new clientAPI();
Trace.Write("Timer Started" );
Timer timer = new Timer(new TimerCallback(GetQuotes), null, 0, 10000);
}
public void GetQuotes(object obj)
{
Trace.Write("Timer Pass:" + timerPasser++);
if (currentWork > workList.Count - 1)
currentWork = 0;
Thread t = new Thread(Quote);
t.Start(workList);
}
private void Quote(object obj)
{
Trace.Write("Entered Quotes:" + quotesIn++);
lock (workList)
{
List<Work> works = new List<Work>();
int error = 0;
foreach (Work w in works)
{
client.CreateClientAPI();
//Work Work Work
client.DestroyClientAPI();
}
Trace.Write("Exits Quotes:" + d);
QuotesReturned(works);
}
}
private void QuotesReturned(List<Work> works)
{
Model.PIP pip;
foreach (Work w in works)
{
}
}
}
The timer base function suppose run for life time in a web service... the problem is the timer works once or twice and it stops i don't know why? I can't find the reason why. It must be due to threading. There was same kind of problem when i implemented something like this based on even handlers instead of timer..
Timer StartedTimer Pass:0Entered Quotes:0Exits Quotes:1The thread '' (0xb18) has exited with code 0 (0x0). Timer Pass:1Entered Quotes:1Exits Quotes:2The thread '' (0x153c) has exited with code 0 (0x0). Timer Pass:2Entered Quotes:2Exits Quotes:3The thread '' (0xf10) has exited with code 0 (0x0). Timer Pass:3Entered Quotes:3Exits Quotes:4The thread '' (0x1044) has exited with code 0 (0x0). Timer Pass:4Entered Quotes:4Exits Quotes:5The thread '' (0xd24) has exited with code 0 (0x0). Timer Pass:5Entered Quotes:5Exits Quotes:6The thread '' (0x688) has exited with code 0 (0x0). Timer Pass:6Entered Quotes:6Exits Quotes:7The thread '' (0x17c8) has exited with code 0 (0x0). Timer Pass:7Entered Quotes:7Exits Quotes:8The thread '' (0xf34) has exited with code 0 (0x0). Timer Pass:8Entered Quotes:8Exits Quotes:9The thread '' (0x16f4) has exited with code 0 (0x0). Timer Pass:9Entered Quotes:9Exits Quotes:10The thread '' (0xf74) has exited with code 0 (0x0). Timer Pass:10Entered Quotes:10Exits Quotes:11The thread '' (0x938) has exited with code 0 (0x0). Timer Pass:11Entered Quotes:11Exits Quotes:12The thread '' (0x1048) has exited with code 0 (0x0). Timer Pass:12Entered Quotes:12Exits Quotes:13The thread '' (0x17dc) has exited with code 0 (0x0). Timer Pass:13Entered Quotes:13Exits Quotes:14The thread '' (0x174c) has exited with code 0 (0x0). Timer Pass:14Entered Quotes:14Exits Quotes:15The thread '' (0x132c) has exited with code 0 (0x0). Timer Pass:15Entered Quotes:15Exits Quotes:16The thread '' (0x3f8) has exited with code 0 (0x0). Timer Pass:16Entered Quotes:16Exits Quotes:17The thread '' (0x10cc) has exited with code 0 (0x0). Timer Pass:17The thread '' (0x1534) has exited with code 0 (0x0). Entered Quotes:17Exits Quotes:18The thread '' (0x1050) has exited with code 0 (0x0). The thread '' (0x850) has exited with code 0 (0x0). Timer Pass:18Entered Quotes:18Exits Quotes:19The thread '' (0xca0) has exited with code 0 (0x0). Timer Pass:19Entered Quotes:19Exits Quotes:20The thread '' (0x1120) has exited with code 0 (0x0). Timer Pass:20Entered Quotes:20Exits Quotes:21The thread '' (0x508) has exited with code 0 (0x0). Timer Pass:21Entered Quotes:21Exits Quotes:22The thread '' (0x1598) has exited with code 0 (0x0). Timer Pass:22Entered Quotes:22Exits Quotes:23The thread '' (0xb2c) has exited with code 0 (0x0). Timer Pass:23Entered Quotes:23Exits Quotes:24The thread '' (0x1600) has exited with code 0 (0x0). Timer Pass:24Entered Quotes:24Exits Quotes:25The thread '' (0x13bc) has exited with code 0 (0x0). Timer Pass:25Entered Quotes:25Exits Quotes:26The thread '' (0x131c) has exited with code 0 (0x0). Timer Pass:26Entered Quotes:26Exits Quotes:27The thread '' (0x5f4) has exited with code 0 (0x0). Timer Pass:27Entered Quotes:27Exits Quotes:28The thread '' (0x128) has exited with code 0 (0x0). Timer Pass:28Entered Quotes:28Exits Quotes:29The thread '' (0x1420) has exited with code 0 (0x0). Timer Pass:29The thread '' (0xc64) has exited with code 0 (0x0). Entered Quotes:29Exits Quotes:30The thread '' (0xedc) has exited with code 0 (0x0). Timer Pass:30Entered Quotes:30Exits Quotes:31The thread '' (0x136c) has exited with code 0 (0x0). Timer Pass:31Entered Quotes:31Exits Quotes:32The thread '' (0xeb8) has exited with code 0 (0x0). Timer Pass:32Entered Quotes:32Exits Quotes:33The thread '' (0x690) has exited with code 0 (0x0). Timer Pass:33Entered Quotes:33Exits Quotes:34The thread '' (0x1320) has exited with code 0 (0x0). Timer Pass:34Entered Quotes:34Exits Quotes:35The thread '' (0x11b8) has exited with code 0 (0x0). Timer Pass:35Entered Quotes:35Exits Quotes:36The thread '' (0x1684) has exited with code 0 (0x0). Timer Pass:36Entered Quotes:36Exits Quotes:37The thread '' (0x1294) has exited with code 0 (0x0). The thread '' (0x1240) has exited with code 0 (0x0). The thread '' (0xde8) has exited with code 0 (0x0).
and is stops....
and done...no good
Solution Put the line Timer timer; on the top of the class
Upvotes: 1
Views: 2464
Reputation: 42363
You say this is a webservice - timers are not guaranteed to work correctly in a web service as the lifetime of the owning threads is not guaranteed. Consider using a global worker thread that is created when the app domain starts up.
A basic global worker thread is:
static bool _stopPolling = false;
static Thread _pollerThread;
static object _oneTimeLocker = new object();
private static CreatePollerThread()
{
if(_pollerThread == null)
{
lock(_oneTimeLocker)
{
if(_pollerThread == null) //double-check
{
_pollerThread = new Thread(
new ThreadStart(() =>
{
while(true && !_stopPolling)
{
DoWork();
Thread.Sleep(10000);
}
}));
_pollerThread.Start();
}
}
}
}
I've used a double-checked lock there in case you want to fire up the global thread in response to a request (not best policy - since you can then have multiple requests trying to intialise the thread, potentially doing it multiple times). This isn't the only way - but it's rolling off my tongue at the moment given that I'm at work and don't have a lot of time!
An important factor here is the _stopPolling boolean that you use to shut the thread down in a friendly manner.
If you're in Asp.Net - then this SO: Application_End and background processes, exiting ASP.Net application gracefully, with answer by Aristos, will help you with how best to shut the thread down.
Upvotes: 2
Reputation: 7306
The timer instance is declared within the ctor, then it will be garbaged within a relatively short time. Thus the death of the timer. Pin the "timer" var at the class level.
However, you should dispose the timer once you don't use anymore.
Cheers
Upvotes: 3
Reputation: 273794
Timer timer = new Timer(new TimerCallback(GetQuotes), null, 0, 10000);
timer.InitializeLifetimeService();
InitializeLifetimeService()
returns an object that you're supposed to do something with. The default lease uses a timeout of 10 secs, same as your interval. Seems plausible that you timer is cancelled if processing takes a little too long.
Upvotes: 3