Asynchronous Fire-And-Forget Call

Discussion in 'ASP .Net' started by Stephen Barrett, Apr 11, 2006.

  1. I have read many threads related to async fire and forget type calls, but
    none have addressed my particular problem.

    I have a webpage that instantiates a BL object and makes a method call. The
    BL object method actually sets up a delegate and calls a private method
    asynchronously and immediately returns back to the web page.

    The problem I am having is that the async call never happens. I added a
    quick logging call immediately as the first line of code in the method that
    is suppose to get called asynchronously and it never gets called.

    I am using an AsyncHelper class mentioned in other posts to help get around
    the memory leak issues regarding not calling EndInvoke after a BeginInvoke.

    If I call the public method of the BL and just have it call the internal one
    without using an async delegate, everything works fine except that the
    webpage eventually times out because it can be a very long process.

    I am thinking about maybe spawning a new thread manually and letting handle
    the long running process to see if I can around the issue. Any ideas on how
    to do this asynchronously fire-and-forget within the BL would be greatly
    appreciated.
     
    Stephen Barrett, Apr 11, 2006
    #1
    1. Advertising

  2. You should probably set up a Windows Service to handle such background tasks
    reliably.
    In ASP.NET threads come and go too quickly for synchronization to be of much
    use in most cases.

    Here's more info on Windows Services:
    http://msdn.microsoft.com/library/d.../vbconintroductiontontserviceapplications.asp

    --
    I hope this helps,
    Steve C. Orr, MCSD, MVP
    http://SteveOrr.net


    "Stephen Barrett" <> wrote in message
    news:...
    >I have read many threads related to async fire and forget type calls, but
    >none have addressed my particular problem.
    >
    > I have a webpage that instantiates a BL object and makes a method call.
    > The BL object method actually sets up a delegate and calls a private
    > method asynchronously and immediately returns back to the web page.
    >
    > The problem I am having is that the async call never happens. I added a
    > quick logging call immediately as the first line of code in the method
    > that is suppose to get called asynchronously and it never gets called.
    >
    > I am using an AsyncHelper class mentioned in other posts to help get
    > around the memory leak issues regarding not calling EndInvoke after a
    > BeginInvoke.
    >
    > If I call the public method of the BL and just have it call the internal
    > one without using an async delegate, everything works fine except that the
    > webpage eventually times out because it can be a very long process.
    >
    > I am thinking about maybe spawning a new thread manually and letting
    > handle the long running process to see if I can around the issue. Any
    > ideas on how to do this asynchronously fire-and-forget within the BL would
    > be greatly appreciated.
    >
     
    Steve C. Orr [MVP, MCSD], Apr 11, 2006
    #2
    1. Advertising

  3. I would really love to go the service route. What I originally specd out
    was for the BL that the webpage calls to write a message to MSMQ and have a
    service that processed messages from the queue. This would be quick and not
    involve extra threading and such.

    Unfortunately, things out of my control prevent me from using any form of
    windows service. The app is deployed to a shared server that many other app
    groups use and the high-level managers on the IT side have limited us on
    what we can do. Windows services are one thing they said no too. In fact,
    our BL tier used to be on a separate server all together that we accessed
    through Remoting where the async stuff worked fine. One of these
    requirements forced us to bring the BL tier back in process on the webserver
    and this is when we started running into problems.

    Any ideas on how to do this in when the BL tier is running within the
    asp.net web app?

    "Steve C. Orr [MVP, MCSD]" <> wrote in message
    news:...
    > You should probably set up a Windows Service to handle such background
    > tasks reliably.
    > In ASP.NET threads come and go too quickly for synchronization to be of
    > much use in most cases.
    >
    > Here's more info on Windows Services:
    > http://msdn.microsoft.com/library/d.../vbconintroductiontontserviceapplications.asp
    >
    > --
    > I hope this helps,
    > Steve C. Orr, MCSD, MVP
    > http://SteveOrr.net
    >
    >
    > "Stephen Barrett" <> wrote in message
    > news:...
    >>I have read many threads related to async fire and forget type calls, but
    >>none have addressed my particular problem.
    >>
    >> I have a webpage that instantiates a BL object and makes a method call.
    >> The BL object method actually sets up a delegate and calls a private
    >> method asynchronously and immediately returns back to the web page.
    >>
    >> The problem I am having is that the async call never happens. I added a
    >> quick logging call immediately as the first line of code in the method
    >> that is suppose to get called asynchronously and it never gets called.
    >>
    >> I am using an AsyncHelper class mentioned in other posts to help get
    >> around the memory leak issues regarding not calling EndInvoke after a
    >> BeginInvoke.
    >>
    >> If I call the public method of the BL and just have it call the internal
    >> one without using an async delegate, everything works fine except that
    >> the webpage eventually times out because it can be a very long process.
    >>
    >> I am thinking about maybe spawning a new thread manually and letting
    >> handle the long running process to see if I can around the issue. Any
    >> ideas on how to do this asynchronously fire-and-forget within the BL
    >> would be greatly appreciated.
    >>

    >
    >
     
    Stephen Barrett, Apr 12, 2006
    #3
  4. I forgot to mention that is a .net 1.1 asp.net app and not a 2.0.

    "Stephen Barrett" <> wrote in message
    news:...
    >I have read many threads related to async fire and forget type calls, but
    >none have addressed my particular problem.
    >
    > I have a webpage that instantiates a BL object and makes a method call.
    > The BL object method actually sets up a delegate and calls a private
    > method asynchronously and immediately returns back to the web page.
    >
    > The problem I am having is that the async call never happens. I added a
    > quick logging call immediately as the first line of code in the method
    > that is suppose to get called asynchronously and it never gets called.
    >
    > I am using an AsyncHelper class mentioned in other posts to help get
    > around the memory leak issues regarding not calling EndInvoke after a
    > BeginInvoke.
    >
    > If I call the public method of the BL and just have it call the internal
    > one without using an async delegate, everything works fine except that the
    > webpage eventually times out because it can be a very long process.
    >
    > I am thinking about maybe spawning a new thread manually and letting
    > handle the long running process to see if I can around the issue. Any
    > ideas on how to do this asynchronously fire-and-forget within the BL would
    > be greatly appreciated.
    >
     
    Stephen Barrett, Apr 12, 2006
    #4
  5. you need to setup a background thread to do this. this is because of the
    page life cycle.

    1. at the start of the request a thread is selected from the pool.
    2. a new instance of the page is created
    3. the page lifecycle methods are called
    4. the request is sent back to the iis.
    5. the thread is return to the pool.

    it a litle more complicated, as the thread may be returned to the pool and
    new one selected during page lifecycle processing.

    as you can see, when your delegate fires, the thread that started the async
    request may be in the pool, destroyed, or processing the next page request.

    if your site has light load, you can create a new thread everytime, if not,
    you proably want one background thread, or a pool, created as needed. then
    use a queue to send work to it.

    note: the new thread will run as the asp.net account, not the account of the
    thread creating it, so you may need to do some impersonation.

    -- bruce (sqlwork.com)





    "Stephen Barrett" <> wrote in message
    news:...
    >I have read many threads related to async fire and forget type calls, but
    >none have addressed my particular problem.
    >
    > I have a webpage that instantiates a BL object and makes a method call.
    > The BL object method actually sets up a delegate and calls a private
    > method asynchronously and immediately returns back to the web page.
    >
    > The problem I am having is that the async call never happens. I added a
    > quick logging call immediately as the first line of code in the method
    > that is suppose to get called asynchronously and it never gets called.
    >
    > I am using an AsyncHelper class mentioned in other posts to help get
    > around the memory leak issues regarding not calling EndInvoke after a
    > BeginInvoke.
    >
    > If I call the public method of the BL and just have it call the internal
    > one without using an async delegate, everything works fine except that the
    > webpage eventually times out because it can be a very long process.
    >
    > I am thinking about maybe spawning a new thread manually and letting
    > handle the long running process to see if I can around the issue. Any
    > ideas on how to do this asynchronously fire-and-forget within the BL would
    > be greatly appreciated.
    >
     
    bruce barker \(sqlwork.com\), Apr 12, 2006
    #5
  6. IS this as simple as setting the IsBackground property to TRUE when I create
    the new thread?

    I have tried numerous methods to get this to work.

    1) create delegate to private method, and call BeginInvoke with calling
    EndInvoke (memory leak possible)

    2) create deleate to private method and use AsyncHelper class to basically
    fire and forget

    3) create a new Thread with ThreadStart pointing to private method

    The private method is not getting called in any of these scenarios. Isn't
    there a way to create a thread that will survive once the page life cycle
    thread finishes?


    "bruce barker (sqlwork.com)" <> wrote
    in message news:...
    > you need to setup a background thread to do this. this is because of the
    > page life cycle.
    >
    > 1. at the start of the request a thread is selected from the pool.
    > 2. a new instance of the page is created
    > 3. the page lifecycle methods are called
    > 4. the request is sent back to the iis.
    > 5. the thread is return to the pool.
    >
    > it a litle more complicated, as the thread may be returned to the pool and
    > new one selected during page lifecycle processing.
    >
    > as you can see, when your delegate fires, the thread that started the
    > async request may be in the pool, destroyed, or processing the next page
    > request.
    >
    > if your site has light load, you can create a new thread everytime, if
    > not, you proably want one background thread, or a pool, created as needed.
    > then use a queue to send work to it.
    >
    > note: the new thread will run as the asp.net account, not the account of
    > the thread creating it, so you may need to do some impersonation.
    >
    > -- bruce (sqlwork.com)
    >
    >
    >
    >
    >
    > "Stephen Barrett" <> wrote in message
    > news:...
    >>I have read many threads related to async fire and forget type calls, but
    >>none have addressed my particular problem.
    >>
    >> I have a webpage that instantiates a BL object and makes a method call.
    >> The BL object method actually sets up a delegate and calls a private
    >> method asynchronously and immediately returns back to the web page.
    >>
    >> The problem I am having is that the async call never happens. I added a
    >> quick logging call immediately as the first line of code in the method
    >> that is suppose to get called asynchronously and it never gets called.
    >>
    >> I am using an AsyncHelper class mentioned in other posts to help get
    >> around the memory leak issues regarding not calling EndInvoke after a
    >> BeginInvoke.
    >>
    >> If I call the public method of the BL and just have it call the internal
    >> one without using an async delegate, everything works fine except that
    >> the webpage eventually times out because it can be a very long process.
    >>
    >> I am thinking about maybe spawning a new thread manually and letting
    >> handle the long running process to see if I can around the issue. Any
    >> ideas on how to do this asynchronously fire-and-forget within the BL
    >> would be greatly appreciated.
    >>

    >
    >
     
    Stephen Barrett, Apr 13, 2006
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ames Andreas (MPA/DF)
    Replies:
    0
    Views:
    328
    Ames Andreas (MPA/DF)
    Aug 5, 2004
  2. Braulio Diez
    Replies:
    4
    Views:
    634
    Braulio Diez
    Feb 9, 2008
  3. Michael Ulm

    process fire and forget?

    Michael Ulm, Nov 29, 2004, in forum: Ruby
    Replies:
    1
    Views:
    166
    Yukihiro Matsumoto
    Nov 29, 2004
  4. U.Mutlu

    freeze and forget it :-)

    U.Mutlu, Feb 12, 2012, in forum: C++
    Replies:
    4
    Views:
    302
    Jorgen Grahn
    Feb 12, 2012
  5. Dave Saville

    Fire and forget under OS/2

    Dave Saville, Oct 3, 2012, in forum: Perl Misc
    Replies:
    2
    Views:
    355
    Dave Saville
    Oct 4, 2012
Loading...

Share This Page