I don't personally use AppDomains, but then - I don't interface with tasks that are liable to fail: I prefer to write ones that don't by using defensive programming techniques.
If you look at the MSDN documentation:
http://msdn.microsoft.com/en-gb/library/system.appdomain.aspx[
^] it's pretty clearly stated:
Application domains, which are represented by AppDomain objects, help provide isolation, unloading, and security boundaries for executing managed code.
- Use application domains to isolate tasks that might bring down a process. If the state of the AppDomain that's executing a task becomes unstable, the AppDomain can be unloaded without affecting the process. This is important when a process must run for long periods without restarting. You can also use application domains to isolate tasks that should not share data.
- If an assembly is loaded into the default application domain, it cannot be unloaded from memory while the process is running. However, if you open a second application domain to load and execute the assembly, the assembly is unloaded when that application domain is unloaded. Use this technique to minimize the working set of long-running processes that occasionally use large DLLs.
Covers it pretty well, I think.