Here I will post some code snippets that I think will help my fellow C# programmer brothers to develop some Cute Autobuyer. First, HowTo lunch a thread (Without params) Code (Text): Thread restocking = new Thread(new ThreadStart(restock)) ; restocking.Name = "Restocking thread"; restocking.Start(); Second Howto lunch a thread (With params) Here is what we CAN'T do Code (Text): Thread restocking = new Thread(new ThreadStart(restock("http://www.neopets.com") )) ;//WRONG !THE COMPILER DENY YOU. restocking.Name = "Restocking thread"; restocking.Start(); Here the code that do the job, since the class Thread don't accept thread we have to do a trick, we have to create a class that will contains our parameter and call the method we need via the new class. Code (Text): autoBuyer aber = new autoBuyer("http://www.neopets.com"); Thread restock= new Thread(new ThreadStart(aber.doRestock )); restocking.Name = "Restocking thread"; restock.Start(); private class autoBuyer { string url; public autoBuyer(string url) //constructor { this.url = url; } public doRestock() { restock(url);//this is the method we want to lunch in the thread } } Third, How to use delegates, since you use threading now you need to know how to acces a variable outside the thread. If you don't do that you will have cross threading exceptions. That would be bad since it makes crash your application. For example, if you want to write a message in your text box to show the current status in your thread you'll have to use a delegate. Code (Text): delegate void showStatusDelegate(string message);//This is the delegate private void showStatus(string message) { //This is the method that will put your string into the text box if (txtStatus.InvokeRequired){ this.txtStatus.Invoke(new showStatusDelegate(this.showStatus), message); } else { txtStatus.Text = message; } } //Here is an example inside a thread showStatus("Yo I'm chill in this thread"); Fourth, how to make a HTTP request. I suggest you to use my HTTP wrapper, but people may want to make their own and that's ok. There's around 3 important steps, in order to make a HTTP request and get the response. ( GET EXAMPLE) Code (Text): // First we need to build the request so we need to make a HttpWebRequest object. HttpWebRequest request = HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.neopets.com"); //Here we set all the attributes of the request request.Method = "GET"; request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1"; request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,*/*;q=0.8"; request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-us,en;q=0.5"); request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); request.Headers.Add(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); request.Headers.Add(HttpRequestHeader.KeepAlive, "300"); request.KeepAlive = true; request.Referer = "http://www.google.com" ;//usually in neopet you need to have the good referer, else the page won't load request.CookieContainer = new CookieContainer() ; //here you usually to get the cookie properly(log in and get cookies) this do really nothing request.Proxy = null;//if you don't do that it will search for proxy and will make you wait 15seconds request.AllowAutoRedirect = false; //Here we get the response from the HttpWebRequest HttpWebResponse resp = (HttpWebResponse)request.GetResponse(); //we change the response into a Stream Stream responseStream = resp.GetResponseStream(); //if we see in the stream gzip it's ziped else it's not if (resp.ContentEncoding.ToLower().Contains("gzip")) responseStream = new GZipStream(responseStream, CompressionMode.Decompress); else if (resp.ContentEncoding.ToLower().Contains("deflate")) responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); //from the reponse stream we read the html with StreamReader StreamReader Reader = new StreamReader(responseStream, Encoding.Default); string Html = Reader.ReadToEnd(); //Here you have your html code responseStream.Close();//Don't forget to close else your buffer will be full, and that's uncool resp.Close(); return Html; Same thing but with a POST (POST EXAMPLE) Code (Text): /* CONSTRUCTION OF THE QUERY */ _cookieJar = new CookieContainer(); string data = "username=" + username + "&password=" + password + "&destination=%2Fpetcentral.phtml"; int content_lenght = data.Length; HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.neopets.com/login.phtml"); req.Method = "POST"; req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1"; req.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-us,en;q=0.5"); req.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); req.Headers.Add(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); req.Headers.Add(HttpRequestHeader.KeepAlive, "300"); req.KeepAlive = true; req.ContentType = "application/x-www-form-urlencoded"; req.Referer = "http://www.neopets.com/hi.phtml"; req.CookieContainer = _cookieJar; req.ContentLength = content_lenght; req.AllowAutoRedirect = false; req.Proxy = null; req.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; _referer = "http://www.neopets.com/hi.phtml";//still hi.phtml yes Console.WriteLine(_referer); /* ENCODING POST DATA */ byte[] bytes = System.Text.Encoding.ASCII.GetBytes(data); Stream os = req.GetRequestStream(); os.Write(bytes, 0, bytes.Length); os.Close(); /* GETTING THE ANWSER */ HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); //we change the response into a Stream Stream responseStream = resp.GetResponseStream(); bool connected = false; foreach (Cookie cook in resp.Cookies) { _cookieJar.Add(cook); if (cook.Name.Contains("neologin")) connected = true; } (Yes this code may help you to log in) If you can use/edit these for your programs then I would make me happy. Comments and suggestions are welcome !