 <p>How about changing that <code>Action</code> delegate to <code>Action&lt;T&gt;</code>.</p> <pre><code>public static class Tools { public static void RunAsync&lt;T&gt;(Action&lt;T&gt; function, Action callback, T parameter) { BackgroundWorker worker = new BackgroundWorker(); worker.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs e) { callback(); }; worker.DoWork += delegate(object sender, DoWorkEventArgs e) { function(parameter); }; worker.RunWorkerAsync(); } } </code></pre>