开发者

Executing method by timer inside threadpool

开发者 https://www.devze.com 2023-03-18 09:14 出处:网络
In my multi threaded web app I invoke in the ThreadPool SomeMethod which can throw an exception. Suppose I want to make a few at开发者_StackOverflowtempts if it causes an exception at first call. I de

In my multi threaded web app I invoke in the ThreadPool SomeMethod which can throw an exception. Suppose I want to make a few at开发者_StackOverflowtempts if it causes an exception at first call. I decide to use System.Timers.Timer inside my action for attempts. Can I use the code below? Is it safely?

static void Caller()
{
    ThreadPool.QueueUserWorkItem(action =>
        {
            try
            {
                SomeMethod();
                Console.WriteLine("Done.");
            }
            catch
            {
                var t = new System.Timers.Timer(1000);
                t.Start();
                var count = 0;
                t.Elapsed += new System.Timers.ElapsedEventHandler((o, a) =>
                {
                    var timer = o as System.Timers.Timer;
                    count++;
                    var done = false;
                    Exception exception = null;
                    try
                    {
                        Console.WriteLine(count);
                        SomeMethod();
                        done = true;
                    }
                    catch (Exception ex)
                    {
                        exception = ex;
                    }
                    if (done || count == 10)
                    {
                        Console.WriteLine(String.Format("Stopped. done: {0}, count: {1}", done, count));
                        t.Stop();
                        if (!done) throw exception;
                    }
                });
            }
        });
    Thread.Sleep(100000);
}

static void SomeMethod()
{
    var x = 1 / new Random().Next(0, 2);
}


You should Dispose each Timer after use, that's for sure. But, probably you could do something even simpler:

static void Main()
{
    ThreadPool.QueueUserWorkItem(action =>
    {
        while (TrySomeMethod() == false)
            Thread.Sleep(1000);
    });

    // wait here
    Console.Read();
}

static bool TrySomeMethod()
{
    try
    {
         SomeMethod();
         return true;
    }
    catch
    {
         return false;
    }
}


I do not think that using a timer in a thread pool thread is a safe approach. I may be wrong, but the timer will raise its elapsed event when the thread method has already been finished to execute. In this case, the exception will be thrown. Also, I do not see that you are not disposing the timer which leads to resource leaks. If you explain why you need the timer, I will try to find a safe solution...


I don't see the point of using a Timer within a ThreadPool queue, because the ThreadPool would spawn a new thread, and the Timer would spawn a new thread as well.

I would just have a loop within that delegate, because it would not block the main thread either way. Groo showed a good example of that.

0

精彩评论

暂无评论...
验证码 换一张
取 消