Progressbar für Funktion vom WebService

kanti

Mitglied
hallo,

Ich rufe von meinem Client eine Funktion vom WebService auf.
Da die Funktion sehr lange Braucht zum Ausführen würde ich dies gerne mit dem Steuerelement Progressbar verfolgen.

Code:
Form1.autom.Timeout = Integer.MaxValue
        Form1.xmldoc.Load("E:\Internetadressen.xml")
        Form1.sxml2 = Form1.autom.automatKlass(Form1.ComboBox1.Text, Form1.xmldoc).OuterXml

        Form1.xmldoc2.LoadXml(xml:=Form1.sxml2)
        Form5.Show()

Das ist der Code wo die Funktion aufgerufen wird.
Ich möchte jetzt für den folgenden Aufruf eine Progressbar einfügen:
Code:
Form1.autom.automatKlass(Form1.ComboBox1.Text, Form1.xmldoc).OuterXml

Kann mir da jemand helfen?

Danke

mfg

Mathias
 
Folgendes Problem:
Vermutlich wirst du keinen Anhaltspunkt haben, wie lange der Transfer der Daten dauert. Einmal vermutlich ein paar Sekunden, dann wieder etwas länger, richtig?

Zwei Möglichkeiten:
1. Du baust dir einen eigenen Progressbar der quasi einen pending-Status anzeigt. Dies bedeutet, der Progressbar bewegt sich á la Night Rider :) Dadurch wird dem User signalisiert, dass es etwas Zeit braucht, die Daten zu holen und wirkt dadurch natürlich zeit-verkürzend.

2. Du löst dieses Problem asynchron über das WebServvice. Dazu müsstest du natürlich entsprechende Informationen austauschen, was dadurch sehr viel aufwändiger wird. Hier hängt es sehr stark von deiner Architektur ab, wie einfach dies zu realisieren ist.
 
Ich würde die erste Variante nehmen.

Aber wie implementier ich das?

meine Form sieht so aus:

Code:
Public Class Form6

Private Sub Form6_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Form1.autom.Timeout = Integer.MaxValue
        Form1.xmldoc.Load("E:\Internetadressen.xml")

        Form1.sxml2 = Form1.autom.automatKlass(Form1.ComboBox1.Text, Form1.xmldoc).OuterXml

        Form1.xmldoc2.LoadXml(xml:=Form1.sxml2)
        Form5.Show()
    End Sub
End Class

Für Hilfe wäre ich dankbar

mfg

Mathias
 
Hallo,
ich hab da mal was probiert:

Code:
Public Class Form6

    Delegate Sub ShowProgress()

    Private endflag As Boolean
    ' Create a delegate that points to it.
    Dim asyncFill As New ShowProgress(AddressOf ExecProgress)

    ' Open it asynchronously - pass the delegate as the cookie.
    Dim ar As IAsyncResult = asyncFill.BeginInvoke(AddressOf ShowComplete, asyncFill)


    Private Sub Form6_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Control.CheckForIllegalCrossThreadCalls = False
        Form1.autom.Timeout = Integer.MaxValue
        Form1.xmldoc.Load("E:\Internetadressen.xml")

        Form1.sxml2 = Form1.autom.automatKlass(Form1.ComboBox1.Text, Form1.xmldoc).OuterXml

        Form1.xmldoc2.LoadXml(xml:=Form1.sxml2)
        Form5.Show()
        
    End Sub

    ' this method is called when the operation is completed
    Private Sub ShowComplete(ByVal ar As IAsyncResult)
        
        'retrieve a reference to the delegate.
        Dim asyncFill As ShowProgress = CType(ar.AsyncState, ShowProgress)
        Try
            ' Complete the operation.
            asyncFill.EndInvoke(ar)
            Me.Close()
            Me.Controls.Remove(ProgressBar1)
        Catch ex As Exception
            Console.WriteLine(ex.ToString)
        End Try
    End Sub

    ' Show ProgressBar and animate
    Private Sub ExecProgress()
        ' reset End-Flag
        endflag = False
        ' ProgressBar

        With ProgressBar1
            Do Until endflag
                If .Value < .Maximum Then
                    .Value = .Value + 1
                Else
                    .Value = 0
                End If
                System.Threading.Thread.Sleep(50)
            Loop
        End With
    End Sub

End Class

Nur fuktioniert es nicht.
Die ProgressBar öffnet sich erst nach dem Prozess zu ende ist und schließt nicht automatisch.
Weiß jemand wie es richtig sein muss, damit dieProgressBar solange bleibt bis die Prozesse in Form6_Load zu Ende sind?

Danke

mfg

Mathias
 
Du könntest dir dazu ja eine eigene ProgressBar bauen, die genau diese Funktionalität für dich übernimmt. Dazu musst du eigentlich nur ein UserControl erstellen, einen Bar zeichnen, der von links nach rechts wandert und wieder zurück.
 
könntest du mir dabei helfen ein UserCntrol dafür zubauen?
Ich will ja ne einfache Lösung dafür.

Kannst du mir da helfen?

danke

Mathias
 
Ich hab jetzt

ProgressBar1.Style = ProgressBarStyle.Marquee

genommen.

Das würde bestimmt auch funktionieren, wenn sich die ProgressBar beim Starten der Hauptfunktion nicht aufhängen würde.

Das heißt sie startet nicht wirklich und funktioniert erst nach dem Prozess.
Soll heißen sie läuft wenn der Prozess vorbei ist und das ist nun wirklich nicht Sinn der Sache.

Sie soll ja während des Prozess funktionieren.

Woran kann das liegen? Ist das System überlastet oder was?

danke

Mathias
 
Hab noch was neues funktioniert:

Code:
Public th As New System.Threading.Thread(AddressOf Auto)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ProgressBar1.Visible = True
        ProgressBar1.Style = ProgressBarStyle.Marquee
        Label5.Text = "Suche läuft"

        th.Start()

    End Sub

Public Sub Auto()
        autom.Timeout = Integer.MaxValue
        xmldoc.Load("E:\Internetadressen.xml")
        sxml2 = autom.automatKlass(ComboBox1.Text, xmldoc).OuterXml
        xmldoc2.LoadXml(xml:=sxml2)
        Form5.Show()
        th.Abort()
    End Sub

Aber es funktioniert nicht.
bei Form5.Show meckert er:
Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Das ActiveX-Steuerelement 8856f961-340a-11d0-a96b-00c04fd705a2 kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist..

Weiß jemand woran es liegt....

Danke

Mathias
 

Neue Beiträge

Zurück