Stahování velkého souboru - updater – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Stahování velkého souboru - updater – .NET – Fórum – Programujte.comStahování velkého souboru - updater – .NET – Fórum – Programujte.com

 

Jarda
~ Anonymní uživatel
199 příspěvků
30. 1. 2016   #1
-
0
-

Dobrý den, potřeboval bych radu ohledně stahování velkého souboru. Tvořím updater, který funguje dobře, ovšem největší problém je se stahováním souboru. Při zapnutí aplikace se začne soubor stahovat, ale program se nevykreslí. Vykreslí se až po dokončení stahování. Již jsem chtěl použít nový proces, ale asi s tím neumím pracovat, protože i když stahování jelo přes nový proces, tak se aplikace stále nevykreslí.

Můžete mi prosím ukázat kus kódu v Main pro zapnutí InitializeComponent a metody stahování ?

Nahlásit jako SPAM
IP: 89.176.240.–
Kit+15
Guru
30. 1. 2016   #2
-
0
-

#1 Jarda
Rozděl to na dvě vlákna. Jedno bude stahovat soubor, druhé vykreslovat. Dokonce může vykreslovat i teploměr s průběhem stahování. Po dokončení stahování se to vlákno ukončí.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Jarda
~ Anonymní uživatel
199 příspěvků
30. 1. 2016   #3
-
0
-

#2 Kit
To jsem již zkoušel, ale nevykreslil se program a stahování jelo. Můžete mi prosím napsat kus kódu, který bude tuto akci provádět ?

Nahlásit jako SPAM
IP: 89.176.240.–
Kit+15
Guru
30. 1. 2016   #4
-
0
-

#3 Jarda
Tak to neběželo v samostatných vláknech.

V C# neprogramuji. Nemám na čem.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Jarda
~ Anonymní uživatel
199 příspěvků
30. 1. 2016   #5
-
0
-

#4 Kit
Nebo bych spíše chtěl dodat, že to jelo v samostatných vláknech, ale proces stahování nejel.

Nahlásit jako SPAM
IP: 89.176.240.–
BDS+3
Věrný člen
30. 1. 2016   #6
-
0
-

#5 Jarda
asi nepoužíváš WebClient.DownloadFileAsync ...

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Jarda
~ Anonymní uživatel
199 příspěvků
30. 1. 2016   #7
-
0
-

#6 BDS
Asi jsem to napsal špatně, ale prostě se nespustila metoda, která stahuje, extrahuje a maže.

Nahlásit jako SPAM
IP: 89.176.240.–
BDS+3
Věrný člen
30. 1. 2016   #8
-
0
-

#7 Jarda
to chce sem hodit zdroják

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Jarda
~ Anonymní uživatel
199 příspěvků
31. 1. 2016   #9
-
0
-

   

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.IO.Compression;
using Ionic.Zip;
using System.Threading;
using System.Diagnostics;

namespace KruvalUpdater
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Thread IThread = new Thread(ZkontrolujVerze); //Metoda, která kontroluje verze
            IThread.Start();
        }

        public void update(int localversion)
        {
            WebClient downloader = new WebClient();
            int newversion = localversion + 1;

            ZapisTextu("Probíhá aktualizování...);

            try
            {
                downloader.DownloadFile("http://STRANKA.cz/updater/updates/update" + newversion + ".zip", AppDomain.CurrentDomain.BaseDirectory + @"update" + newversion + ".zip");

                ZapisTextu("Extrahování...");

                using (var zip = ZipFile.Read(AppDomain.CurrentDomain.BaseDirectory + @"update" + newversion + ".zip"))
                {
                    zip.ExtractAll(AppDomain.CurrentDomain.BaseDirectory);
                }

                File.Delete(AppDomain.CurrentDomain.BaseDirectory + @"update" + newversion + ".zip");
            }

            catch (Exception ex)
            {
                ZapisTextu(ex.ToString());
            }

            ZkontrolujVerze();
        }
    }
}

Zdrojový kód bez metod pro kontrolu verzí.

Nahlásit jako SPAM
IP: 89.176.240.–
PiranhaGreg0
Stálý člen
31. 1. 2016   #10
-
0
-

#9 Jarda 

public Form1()
{
    InitializeComponent();

    WebClient downloader = new WebClient();
    downloader.DownloadFileCompleted += downloadComplete;

    downloader.DownloadFileAsync(new Uri("http://stranka.cz/version.zip"), "version.zip");            
}

private void downloadComplete(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    ZapisTextu("Stahování dokončeno!");
}
Nahlásit jako SPAM
IP: 2001:718:2:a2::16...–
Jarda
~ Anonymní uživatel
199 příspěvků
31. 1. 2016   #11
-
0
-

Díky, ale nejde spustit celou metodu v novém procesu ? (tím myslím metodu, která zajišťuje stažení a extrahování)

Nahlásit jako SPAM
IP: 89.176.240.–
PiranhaGreg0
Stálý člen
31. 1. 2016   #12
-
0
-

 Tak můžeš no... ale nezapomínej, že z ní nemůžeš updatovat GUIčko...

public Form1()
{
    InitializeComponent();

    // ...

    Task.Run(() => update(localVersion));
}

void update(int localVersion)
{
    // ...
}
Nahlásit jako SPAM
IP: 2001:718:2:a2::16...–
Jarda
~ Anonymní uživatel
199 příspěvků
31. 1. 2016   #13
-
0
-

Nejde to obyčejně zapnout např. pomocí

Thread IThread = new Thread(ZkontrolujVerze); //Metoda, která kontroluje verze
IThread.Start();

Jen nastavit, aby se proces "neuspával" ?

Nahlásit jako SPAM
IP: 78.45.106.–
BDS+3
Věrný člen
31. 1. 2016   #14
-
0
-

Nějak pořád nechápu smysl dotazu. Přece stahování můžeš spustit pomocí DownloadFileAsync a čekat pomocí while (webClient.IsBusy) zatím co bude stahovat můžeš s aplikací pracovat. Po dokončení DownloadFileCompleted můžeš spustit extrakci atd. celé to můžeš mít i v novém vlákně. Taky můžeš použít BackgroundWorker..

Já bych to celé řešil druhou aplikací, která se bude starat o aktualizace. Tu bych spustil, třeba po startu aplikace, zkontrolovala by verze, stáhla potřebné soubory,  případně i ukončila konfliktní programy, včetně hlavní aplikace a nainstalovala aktualizace (mohla by mít i výchozí nastavení "spustit jako správce").

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
BDS+3
Věrný člen
31. 1. 2016   #15
-
0
-

Aplikace, která spustí stahování po startu, které lze ukončit:

    public partial class Form1 : Form
    {
        private WebClient webClient;
        //pgbStatus je progresbar
        public Form1()
        {
            InitializeComponent();
        }

        private void DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
        {
            pgbStatus.Value = e.ProgressPercentage;
        }

        private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                MessageBox.Show("Stahování přerušeno.");
            }
            else
            {
                MessageBox.Show("Stahování dokončeno.\nExtrahování souborů..");
                //if(Extract())Install();
            }

            pgbStatus.Value = pgbStatus.Minimum;
        }

        private void DownloadFile(string src, string dest)
        {
            try
            {
                webClient = new WebClient();
                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
                webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgress);
                
                webClient.DownloadFileAsync(new Uri(src), dest);
                while (webClient.IsBusy) { Application.DoEvents(); }
                webClient.Dispose();
                webClient = null;
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            if ( webClient!=null && webClient.IsBusy) webClient.CancelAsync();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            this.Refresh();
            string dest = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "VSCODE.exe");
            DownloadFile(@"https://az764295.vo.msecnd.net/public/0.10.6-release/VSCodeSetup.exe", dest);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (webClient != null && webClient.IsBusy) webClient.CancelAsync();
        }
    }

Po spuštění začne automaticky na plochu stahovat program VisualStudioCode!

Dávám ti to sem jen pro inspiraci, program není určitě zrovna kvalitní, ani nemá kompletní ošetření chyb. Ale myslím, že funguje jak potřebuješ. Můžeš dát do vlastního vlákna - tam by asi mělo stačit i while (webClient.IsBusy){} "Application.DoEvents" jsem tam dal, aby šlo přistupovat k formuláři.

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Jarda
~ Anonymní uživatel
199 příspěvků
31. 1. 2016   #16
-
0
-

Já hlavně potřebuji, aby se aplikace úspěšně vykreslila a spustil se proces stahování bez toho, aby aplikace jen na oko uživatele zamrzla - v průběhu stahování psaní zpráv do textboxu a progress bar.

Když jsem zkoušel použít nový proces pro stahování, tak v průběhu spouštění se proces zastavil a ve visual studiu se napsala chyba nullreferenceexception u výpisu zpráv do textboxu.

Nahlásit jako SPAM
IP: 78.45.106.–
BDS+3
Věrný člen
31. 1. 2016   #17
-
0
-

#16 Jarda

1. asi jsem víc nechápavý, než jsem si myslel.

Přece ukázka co jsem ti sem dal  funguje - aplikace  se vykreslí a nezamrzne (dokonce zobrazuje průběh v progressbaru a dá se zrušit).
2. nemůžeš z vlákna přistupovat k formuláři.

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Jarda
~ Anonymní uživatel
199 příspěvků
31. 1. 2016   #18
-
0
-

Děkuji mnohokrát. Bez vás bych byl ztracen.

Nahlásit jako SPAM
IP: 78.45.106.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Podobná vlákna

Čtení velkého souboru — založil richard.zavodny

C# - Stahovani souboru — založil Habl

Stahovaní souboru — založil svobodicz

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý