ProgressBar und Threads - Windows Mobile 6


hrek

Grünschnabel
Hallo,

Ich programmiere eine Applikation, welche Artikel downloaded und diese in eine SQL Database schreibt. Ich habe die Webseite programmiert für die Artikel zu managen. Nun Downloade ich die Artikel in gzip Format und dann dekomprimiere ich dieses zu einem XML-File. Sobald diese prozedure gemacht ist, füge ich die Artikel zum mobile Phone hinzu. Das Funktioniert. Nun möchte ich eine ProgressBar hinzufügen, welche mir den Status des INSERT Befehls zeigt. Jedoch "updatet" sich die ProgressBar nicht. Hier der Code zu meiner Applikation.

Code:
private void btn_send_Click(object sender, EventArgs e)
    {
        label1.Text = "Download started";
        string ArticlesURL = "URLTOSITE";
        InvokeAsync(ArticlesURL);

    }

private void InvokeAsync(string URL)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.AllowWriteStreamBuffering = true;
        allDone.Reset();
        request.BeginGetRequestStream(new AsyncCallback(ReadArticlesCallback), request);
        allDone.WaitOne();
        request.BeginGetResponse(new AsyncCallback(ResponseArticlesCallback), request);
    }

private static void ReadArticlesCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        //End the operation.
        Stream postSream = request.EndGetRequestStream(asynchronousResult);

        string postData = "articles=test";
        //Convert the string into a byte array.
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        //Write to the request stream.
        postSream.Write(byteArray, 0, postData.Length);
        postSream.Close();
        allDone.Set();
    }

    private static void ResponseArticlesCallback(IAsyncResult asynchronousResult)
    {
        Form1 f = new Form1();
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        HttpWebResponse resp = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        Stream streamResponse = resp.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd();
        nbrArticles = Convert.ToInt16(responseString);
        // Close the stream object.
        streamResponse.Close();
        streamRead.Close();
        // Release the HttpWebResponse.
        resp.Close();
        f.truncate_articles();
        f.get_articles();
    }

private void get_articles()
    {
        string url = "URLTOSITE";
        int startPoint = 0;
        DownloadZipFile((object)startPoint, url);
        DecompressFile();
        Thread loadingThread = new Thread(new ThreadStart(getXmlAndInsertInDB));
        loadingThread.Start();
    }
private void getXmlAndInsertInDB()
    {
        int total = nbrArticles;
        int count = total / 100; //How much articles are 1 percent
        int i = 0;
        String barcode = "";
        String name = "";
        bool state = false;
        XmlTextReader reader = new XmlTextReader("Program Files\\SmartDeviceProject1\\articles.xml");
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element: //The node is an element
                    while (reader.MoveToNextAttribute()) //Get the attributes like barcode, lastname, firstname, pincode
                        switch (reader.Name)
                        {
                            case "barcode":
                                barcode = reader.Value.ToString();
                                state = false;
                                break;
                            case "name":
                                name = reader.Value.ToString();
                                state = true;
                                break;
                        }
                    break;
            }
            if (state == true)
            {
                cmd.CommandText = "INSERT INTO articles(barcode, name) " +
                    "VALUES('" + barcode + "','" + name + "');";
                cmd.ExecuteNonQuery();
                state = false;
                i++;
                if (i == count)
                {
                    progressBar1.Invoke((MethodInvoker)delegate { 
                               progressBar1.Value = step;
                        });
                     i = 0;
                     step++;
                }
            }
        }
        reader.Close();
    }

Danke für eure Hilfe.

EDIT: Ich habe jetzt den Code ein wenig verändert. Nun Habe ich kein ObjectDisposed Error mehr aber die ProgressBar "updatet" sich trotzdem nicht. Hier die änderung:

In der Methode get_articles habe ich den Thread rausgenommen:
Code:
private void get_articles()
    {
        string url = "URLTOSITE";
        int startPoint = 0;
        DownloadZipFile((object)startPoint, url);
        DecompressFile();
       getXmlAndInsertInDB();
    }

und progressBar1.Invoke habe ich durch this.Invoke ersetzt.

Nun beim Debugging funktioniert alles jedoch es "updatet" die ProgressBar nicht.
Heisst der Value der ProgressBar wird inkrementiert. Das machte das Programm vorher nicht sonder ich erhielt immer die Fehlermeldung ObjectDisposed...
 
Zuletzt bearbeitet: