Progressbar do webclient.DownloadString

0

Jak podczepic progressbar pod webclient.downloadstring(pobieranie kody html do stringu)?

0

Nie da sie tego zrobic?

0

Nie, ale możesz użyć DownloadDataAsync, DownloadFileAsync albo OpenReadAsync, które będą zgłaszały zdarzenie DownloadProgressChanged.

0

No wlasnie probowalem i downloaddataasync jest typu void wiec za bardzo nie zwraca niczego

0

Tak ciężko było otworzyć dokumentację i przeczytać kilka zdań?

http://msdn.microsoft.com/en-us/library/ms144190.aspx
When the download completes, the DownloadDataCompleted event is raised. Your application must handle this event to receive notification. The downloaded data is available in the Result property.

0
Byte[] b = null;
            WebClient webClient = new WebClient();
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
	        webClient.DownloadDataAsync(new Uri(url), b);
            Encoding.UTF8.GetString(b); 

W ostatniej linijce wysypuje mi sie program.

0

Jeśli metoda ma w nazwie "*Async", to zazwyczaj trzeba jej użyć w parze ze zdarzeniem "*Completed": http://msdn.microsoft.com/en-us/library/system.net.webclient.downloaddatacompleted.aspx

0

ale mi tu chodzi o co innego .... encoding mam problem bo nie zmienia mi na utf8 ani na ascii

0
MajQel napisał(a):
Byte[] b = null;
            WebClient webClient = new WebClient();
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
	        webClient.DownloadDataAsync(new Uri(url), b);
            Encoding.UTF8.GetString(b); 

W ostatniej linijce wysypuje mi sie program.

I słusznie, bo próbujesz konwertować null.

Odebrane dane przetwarzaj w metodzie zdarzenia DownloadDataCompleted.

0

aaa nie zmienilem tutaj tego.... w programie juz mam zmienione i blad nie dotyczy wielkosci tablicy... sprobuje tak jak mowisz... chociaz nie mam jeszcze za bardzo pomyslu w jakis sposob to zrobic

Mam cos takiego:

Byte[] b = new Byte[60000];
            WebClient webClient = new WebClient();
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
            webClient.DownloadDataCompleted += new AsyncCompletedEventHandler(webClient_DownloadCompleted);
            webClient.DownloadDataAsync(new Uri(url)); 
  void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
	{
	    double bytesIn = double.Parse(e.BytesReceived.ToString());
	    double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
	    double percentage = bytesIn / totalBytes * 100;
	 
	    progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
	}
  void webClient_DownloadCompleted(object sender, AsyncCompletedEventArgs e)
	{
	 //nie wiem co tu dac zeby to tablice bajtow wstaiwalo do stringu i go zwracalo
	}
0

void webClient_DownloadCompleted(object sender, AsyncCompletedEventArgs e) { } jak bym mial to zrobic zeby to zwracalo string ?

The downloaded data is available in the Result property.

0
 Byte[] b = new Byte[60000];
            WebClient webClient = new WebClient();
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
            webClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(webClient_DownloadCompleted);
            webClient.DownloadDataAsync(new Uri(url));
            
            

        }
       void webClient_DownloadCompleted(object sender, DownloadDataCompletedEventArgs e)
	{
        string w = Encoding.ASCII.GetString(e.Result);
    }

Tak o ... weBclient uzywam w funkcji ktora chcialbym aby zwracala string ... downloadcompleted akurat musi chyba przyjmowac wartosc void wiec w tym momencie nie za bardzo sie orientuje jak to wszystko dokonczyc zeby sie kupy trzymalo

0
  private void button1_Click(object sender, EventArgs e)
        {
            czysc();
           

            string str = pobierz(textBox1.Text);
         }
string pobierz(string a)
        {
            string url = "www.google.pl";
            url += a;
            Byte[] b = new Byte[60000];
            WebClient webClient = new WebClient();
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
            webClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(webClient_DownloadCompleted);
            

            webClient.DownloadDataAsync(new Uri(url));
            
            return //NO I WLASNIE W TYM MIEJSCU POWINNA FUNKCJA ZWRACAC KOD HTML POBRANY I PTRZETWORZONY(TZN NA STRING ZAMIENIONY) I NIE MAM POMYSLU JAK TEGO DOKONAC; 
0

hm... z tego co widze to on nie pobiera mi kodu strony ....
Zwyczajnie nie wiem jak dac encoding z byte array do string (ma mi zwrocic kod xhtml)

1

Skoro chcesz mieć progressbar, to nie możesz tego zrobić synchronicznie, a robiąc asynchronicznie nie zrobisz return tak, jak Ty chcesz. Dane odebrane masz dostępne w metodzie obsługującej zdarzenie DownloadDataCompleted, tam możesz je np. przypisać do pola klasy i dalej na nich operować w innych metodach.

A skoro chcesz pobrać źródło strony, to dlaczego używasz metody DownloadDataAsync zamiast DownloadStringAsync (oraz oczywiście zdarzenia DownloadStringCompleted)?

0

Dobrze by było, żeby ta metoda była wywołana w osobnym wątku, bo inaczej będzie ci blokować UI. Jeżeli korzystasz z nowego .NET to możesz pobawić się z async i await, trochę kodu zaoszczędzisz.

class Program
{
    static string DownloadString(string address)
    {
        var webClient = new WebClient();
        var reset = new ManualResetEvent(false);

        webClient.DownloadProgressChanged += (sender, e) =>
            Console.Write("Progress: {0,3}%\r", e.ProgressPercentage);

        string data = null;
        webClient.DownloadDataCompleted += (sender, e) =>
            {
                data = Encoding.ASCII.GetString(e.Result);
                reset.Set();
            };

        webClient.DownloadDataAsync(new Uri(address));
        reset.WaitOne();

        return data;
    }

    static void Main(string[] args)
    {
        var thread = new Thread(() =>
            {
                Console.WriteLine("\nDownloaded {0} chars.", DownloadString(@"adres").Length);
            });

        thread.Start();
        thread.Join();
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1