Если вы используете action.BeginInvoke (), вам необходимо вызвать EndInvoke где-нибудь, иначе платформа должна хранить результат асинхронного вызова в куче, что приводит к утечке памяти.
Если вы не хотите переходить на C # 5 с ключевыми словами async / await, вы можете просто использовать библиотеку Task Parallels в .Net 4. Это намного, намного лучше, чем использование BeginInvoke / EndInvoke, и дает чистый способзапускать и забывать для асинхронных заданий:
using System.Threading.Tasks;
...
void Foo(){}
...
new Task(Foo).Start();
Если у вас есть методы для вызова, которые принимают параметры, вы можете использовать лямбда-выражения для упрощения вызова без необходимости создания делегатов:
void Foo2(int x, string y)
{
return;
}
...
new Task(() => { Foo2(42, "life, the universe, and everything");}).Start();
Я почти уверен (но, по общему признанию, не очень), что синтаксис C # 5 async / await является просто синтаксическим сахаром для библиотеки Task.