[ Milantex @ 25.09.2009. 00:48 ] @
Pozdrav koleZe,
Imam pitanje u vezi asinhronog prenosa podataka.

Naime, imam sajt poput www.sajt.com/file.xml i .NET aplikaciju (kucam C#) i potrebno mi je da asinhrono preuzmem xml iz file.xml na sajtu u neku lokalnu XmlDocument promenljivu u jednoj od metoda u programu.

Kada pokusam preko WebClient DownloadStringAsync metode (koja bi trebalo da, je l', "asinhrono" bez blokiranja thread-a prenese sadrzaj i pozove metod koji povezem sa DownloadStringCompleted radi dalje obrade), desi se to da mi "ipak" program zabode kao kada prenosim sinhrono podatke.

Da li neko moze da mi ispise kratak example kako da resim ovaj problem.

Najidealnije bi bilo da mogu da napravim jednostavnu funkciju XmlDocument AsyncGetXml(Uri Path); no to ce ostati na meni, samo ako moze neko da mi pomogne da na neki nacin sprecim da mi zabode program kada pocne prenosenje preko http-a.

Hvala unapred!
[ markopadjen @ 25.09.2009. 08:09 ] @
Pozdravi koleZi!

Ja koristim u VB.NET -u WebClient sa jednostavnim kodom:

Code:

                Dim remoteUrl As String = "http://www.sajt.com/file.xml"
                Dim myWebClient As New WebClient()
                Dim myDatabuffer As Byte() = myWebClient.DownloadData(remoteUrl)
                File.WriteAllBytes(My.Application.Info.DirectoryPath & "\file.xml", myDatabuffer)


koji pozivam iz BackgroundWorker -a.

Ne sećam se baš tačno zašto iz njega pošto sam pre nekog vremena tako uradio (a posenilio), a ne preko "normalnih" tredova. Verovatno postoji neki razlog.
E, da, ovako ne zabadA uopšte.
[ Milantex @ 25.09.2009. 10:12 ] @
Hvala kolaZa!
Najiskrenije, ja nikada u zivotu nisam koristio backgroundWorker, a zapravo mi nije ni zapao za oko dok niste pomenuli! :D

Resio sam ovako:
Code:

        public XmlDocument GotXML = new XmlDocument();

        private void GetXMLData(Object Sender, DoWorkEventArgs e) {
            String path = "http://www.mojdomen.org/nove_poruke.php?user=Test&pass=12345";
            GotXML.Load(path);
        }

        private void button1_Click( object sender, EventArgs e ) {
            backgroundWorker.DoWork += new DoWorkEventHandler(GetXMLData);
            backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Prikazi);
            backgroundWorker.RunWorkerAsync();
        }

        void Prikazi( object sender, RunWorkerCompletedEventArgs e ) {
            textBox1.Text = GotXML.InnerText;
        }


Ovo GetXMLData(..) ce biti izmenjeno tako da ne otvara putanju tako sto korz url prosledjuje username i pass, jer nije ni malo bezbedno,a li za probu je ok i proradili je jako lepo i nekim cudom odgovor je stigao brzo! :D
Sada jos da to smestim u jedan metod i da napravim klasicu i super je!
Hvala jos jednom, pozz! :D
[ kuzmam @ 25.09.2009. 13:40 ] @
Pogledaj HttpWebRequest/HttpWebResponse i REST primere za C# u kom radis. Resices problem i ovih sifri koje prenosis u plain textu.
Asihron poziv jednostavno mozes da izvedes kreiranjem odgovarajuceg delegate-a koji instanciras prosledjujuci mu odgovarajucu metodu (u tvom primeru za citanje xml sa servera) i zatim zoves BeginInvoke koji ti vraca IAsyncResult, a kome prosledjujes svoju callback funkciju...itd. Probinguj malo :)


[ Milantex @ 26.09.2009. 01:10 ] @
Razumem u potpunosti nacin rada sa delegatima i iasyncresoultom, kao i sa callback metodama itd. :D
I to sam pokusavao i kazem... zabode program :(
Mora da na nekom nezgodnom mestu u metodama koje zovem pristupam "necemu" (a ima dosta toda) sto ne pripada threadu koji je generisao metod pozvan preko delegata i onda sve to zabaguje dok meod ne zavrsi svoj posao i onda tek vrati rezultat koji oslobodi sync upis... bla bla... ne znam da je to, ali imam osecaj.

A sto se poziva tice, da, to sam i resavao preko HttpWebRequest/Responce-a i kor Stream citanja sadrzaja u string i iz nejga generisao sa LoadXML u XmlDocument sam XML koji dalje obradjujem.

Trebalo bi da izbaci MS neku klasicu ili komponenticu koja sama kompletno uredno i bezbedno vraca XML sa poslatog URL-a + headers koji idu za poziv... :D

No, hvala u svakom slucaju koleZa, ovo REST cu da proguglam malo sta si hteo da kazes... ??? da li rest kao rest_of_the_thingies_related_to_the_aforementioned :p ili kako vec... ;)
[ mmix @ 27.09.2009. 09:39 ] @
Da li je u pitanju desktop aplikacija a iz worker threada pozivas GUI metode (npr sakrijes dugme ili slicno)? to hoce da zabode program komotno.