Question: I want to start a job in a new thread or using backgroundworker to do it but havent done that before and asking you wich way I should do it. 

My program has a datagridview with a list of files, one file per row. I want the user to be able to select a row and then press "Start download" to start a background job of the download. I want to get events back of the progress of the download.

I have a class clsDownload that handles everything and raises events back but how do I implement the backgroundworking?

Should I use the System.ComponentModel.BackgroundWorker inside of the class or create some wrapper that handles this or use some other threading stuff?

Thanks.

**Edit:** I dont understand how to implement my download in the backgroundworker, any small example would be very nice. The example on msdn didnt get me far.

I have a download class that has a StartDownload-function. Should I use the backgroundworker IN the class or in the caller? "feeling stupid"

Answer: 
I you are only going to do downloading and don't need other async processing, you can just use the async methods of the [`WebClient`](http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx) class. Though since you already have your own class, that's probably not a solution for you.

Otherwise, you can use [`BackgroundWorker`](http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx) as you mentioned. The MSDN page has an example how to do it.

**EDIT:** The short story is:

* You create the `BackgroundWorker` from the caller;
* When you want to start the background work, you call `BackgroundWorker.RunWorkerAsync`;
* in the `DoWork` event handler you do the background work, in your case you start your download class;
* while you're doing the background work, you have to check every once in a while for `CancelationPending`;
* when you want to report some progress, you need to calculate it in percentage and call `ReportProgress`.

And if you need something really customized, you can always create your own [`Thread`](http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx).

I personally would stick with `BackgroundWorker`. It has a nice set of notifications for various stages of the job. If you use `Thread`, you will have to implement these youself.

I would also make sure the code does not create too many instances. You want to limit the number of concurent downloads and queue anything past that number.
The backgroundworker looks like it should work... There is an example on MSDN.

<http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx>

Or you could do something like:

```
WaitCallBack workCallBack= new WaitCallBack(DownloadMethod);
if(!ThreadPool.QueueUserWorkItem(workCallBack, "ThreadPooled")
{
   // Unable to Pool
}

// Work has been added to pool and will execute when possible

```

Depends what parameters if any you need for the Thread.