Asynchronous Fire-And-Forget Call

S

Stephen Barrett

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.
 
S

Stephen Barrett

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?
 
B

bruce barker \(sqlwork.com\)

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)
 
S

Stephen Barrett

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?
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top