I want a certain action request to trigger a set of e-mail notifications. The user does something, and it sends the emails. However I do not want the user to wait for page response until the system generates and sends the e-mails. Should I use multithreading for this? Will this even work in ASP.NET MVC? I want the user to get a page response back and the system just finish sending the e-mails at it’s own pace. Not even sure if this is possible or what the code would look like. (PS: Please don’t offer me an alternative solution for sending e-mails, don’t have time for that kind of reconfiguration.)
Share
SmtpClient.SendAsyncis probably a better bet than manual threading, though multi-threading will work fine with the usual caveats.http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx
As other people have pointed out, success/failure cannot be indicated deterministically when the page returns before the send is actually complete.
A couple of observations when using asynchronous operations:
1) They will come back to bite you in some way or another. It’s a risk versus benefit discussion. I like the
SendAsync()method I proposed because it means forms can return instantly even if the email server takes a few seconds to respond. However, because it doesn’t throw an exception, you can have a broken form and not even know it.Of course unit testing should address this initially, but what if the production configuration file gets changed to point to a broken mail server? You won’t know it, you won’t see it in your logs, you only discover it when someone asks you why you never responded to the form they filled out. I speak from experience on this one. There are ways around this, but in practicality, async is always more work to test, debug, and maintain.
2) Threading in ASP.Net works in some situations if you understand the
ThreadPool, app domain refreshes, locking, etc. I find that it is most useful for executing several operations at once to increase performance where the end result is deterministic, i.e. the application waits for all threads to complete. This way, you gain the performance benefits while still having a clear indication of results.3) Threading/Async operations do not increase performance, only perceived performance. There may be some edge cases where that is not true (such as processor optimizations), but it’s a good rule of thumb. Improperly used, threading can hurt performance or introduce instability.
The better scenario is out of process execution. For enterprise applications, I often move things out of the ASP.Net thread pool and into an execution service.
See this SO thread: Designing an asynchronous task library for ASP.NET