Progressbar do webclient.DownloadString

Progressbar do webclient.DownloadString
MajQel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
0

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

MajQel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
0

Nie da sie tego zrobic?

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

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

MajQel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
0

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

RE
  • Rejestracja: dni
  • Ostatnio: dni
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.

MajQel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
0
Kopiuj
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.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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

MajQel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
0

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

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0
MajQel napisał(a):
Kopiuj
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.

MajQel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
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:

Kopiuj
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)); 
Kopiuj
  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());
	}
Kopiuj
  void webClient_DownloadCompleted(object sender, AsyncCompletedEventArgs e)
	{
	 //nie wiem co tu dac zeby to tablice bajtow wstaiwalo do stringu i go zwracalo
	}
RE
  • Rejestracja: dni
  • Ostatnio: dni
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.

MajQel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
0
Kopiuj
 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

MajQel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
0
Kopiuj
  private void button1_Click(object sender, EventArgs e)
        {
            czysc();
           

            string str = pobierz(textBox1.Text);
         }
Kopiuj
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; 
MajQel
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 93
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)

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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)?

RE
  • Rejestracja: dni
  • Ostatnio: dni
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.

Kopiuj
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();
    }
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.