 <p>The simplest way to do this is to use code mentioned on <a href="http://msdn.microsoft.com/en-us/library/ms229711.aspx" rel="nofollow">this</a> link and use this in a separate thread. You don't have to worry about creating asynchronous handlers in C#. Infact you could simply take the code on the link put into a method and use this :</p> <pre><code>YourClass c = new YourClass(); Thread thread = new Thread(c.method_to_download); thread.Start(); // continue with WinForms application. /* You can also do the following */ YourClass c = new YourClass(); c.Execute(); // where YourClass is defined as : public class YourClass() { public YourClass() {} public void Execute() { // code to execute the download in a try-catch block. } } </code></pre> <p>YourClass is a custom class that you may use to perfrom the download. It can raise a simple event optionally with arguments when the download is completed from the finally block. Your calling code can accept this event via an event handler and find out the result of the download.</p> <p>This is just two of the ways you can deal with this, there are other ways such as using a Background thread or using asynchronous callbacks with FtpWebRequest class but they all achieve the same result.</p>