Diskuze: Asynchronní stahování
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 41 zpráv z 41.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Dobře, já to zkusím. Pomohl by jsi mi s tím speciálním dotazem a tou 1? To moc nechápu.
Dobra tak jsem tam pridal ten Dictionary a upravil ale co s tímhle?
DownloadFile(Urls[0]);
a
private void Completed(object sender, AsyncCompletedEventArgs e)
{
Urls.RemoveAt(0);
if (Urls.Count > 0)
{
DownloadFile(Urls[0]);
}
}
DownloadFile si uprav, abys mohl zadávat, kam se má stahovat
DownloadFile(Urls[0].Key, Urls[0].Value); // použití
private void DownloadFile(string Url, string Destination) // upravená metoda pro stahování
{
//... vnitřek pak upravíš, aby se bral v potaz destination a stahuješ ten soubor tam
}
Takže jestli tomu správně rozumím tak tohle:
DownloadFile(Urls[0]);
nahradím tímhle:
DownloadFile(Urls[0].Key, Urls[0].Value);
a tohle:
private void Completed(object sender, AsyncCompletedEventArgs e)
{
Urls.RemoveAt(0);
if (Urls.Count > 0)
{
DownloadFile(Urls[0]);
}
}
upravím na:
private void Completed(object sender, AsyncCompletedEventArgs e)
{
Urls.RemoveAt(0);
if (Urls.Count > 0)
{
DownloadFile(Urls[0].Key, Urls[0].Value);
}
}
Jinak
private void DownloadFile...
jsem již upravil.
jj, akorát dictionary myslím nemá metodu RemoveAt, takže místo
Urls.RemoveAt(0);
budeš asi muset použít něco jako
Urls.Remove(Urls.Keys[0]);
Tak je to upravené, ale:
DownloadFile(Urls[0].Key, Urls[0].Value);
píše chybu:
Error 1 The best overloaded method match for
'System.Collections.Generic.Dictionary<string,string>.this[string]'
has some invalid arguments
Error 2 Argument 1: cannot convert from 'int' to 'string'
Error 3 The best overloaded method match for
'System.Collections.Generic.Dictionary<string,string>.this[string]'
has some invalid arguments
Error 4 Argument 1: cannot convert from 'int' to 'string'
Jak máš nadeklarované Urls ?
Dictionary<string, string> Urls = new Dictionary<string, string>();
Takhle to má být, napsal jsem to špatně:
DownloadFile(Urls.Keys.ElementAt(0), Urls[Urls.Keys.ElementAt(0)]);
a tohle?
Urls.Remove(Urls.Keys[0]);
Urls.Remove(Urls.Keys.ElementAt(0));
Aha, díky moc a teď ještě:
1)Mám vepisovat něco tady?:
private void DownloadFile(string Url, string Destination)
{
}
2)Pomohl by jsi mi s tím ukazatelem toho stažení?
(ano, musíš tam samozřejmě nějak zapracovat to, že to nestahuješ napevno někam, ale že to stahuješ na místo, který ti přišlo jako parametr funkce)
Webclientovi jako jeden z parametrů při stahování souboru zadáváš, kam
má soubor stahovat.
Co to nějak zkombinovat s tím, že máš dictionary, ve kterém máš záznamy
jmen souborů (jako klíč) a k nim (jako hodnotu) místo, kam se mají
stáhnout?
Dobrá tak možná bych věděl, ale nevím jak sestavit script.
Nenapsal bys mi ho? Tohle je poslední věc, co budu chtít. Díky
Nejdřív to zkus sám, není to zase tak těžké, myslím, že to stačí okoukat z toho, co už tam máš..
Tak jsem si s tím hrál dvě hodiny a samé chyby už fakt nevím
Dobře tak je to bez chyby mi tam něco chybělo ale nevím, jestli je to dobře:
private void DownloadFile(string Url, string Destination)
{
webClient.DownloadFileAsync(new Uri(Url), Destination);
}
Tohle jo? Jako fakt? Dobrá, jdu to zkusit.
Tak fakt to funguje. Ještě jsem se chtěl zeptat na ty toolStripstatusy jak je teda upravit aby ukazovaly správně.
Nejdřív zkoušej a až když něco nefunguje, tak se ptej
Vím že to musí být v Completed. V tom Completed asi musí být nějaká podmínka která zjišťuje který soubor se právě stahuje a podle toho to vypíše v tom statusu ne? Ale jak to udělat.
Nejsem si jistý, ale možná by to mohlo být v EventArg u completed.
napiš v tý funkci completed
e.
a zmáčkni CTRL+MEZERNÍK, vyjede ti nabídka, co všechno má e k dispozici, tak se tam podívej, jestli tam někde není url stahovaného odkazu nebo název souboru
Myslím, že by jsi si nejdřív měl projít tutoriály (třeba tady na devbooku) a naučit se základy, než začneš psát aplikace, který maj něco stahovat z internetu
Jo já vím, ale když nějakou aplikaci nutně potřebuješ tak si jí
musíš vytvořit. Nevěděl jsem že stahování z Internetu bude tak
komplikované, jako první způsob jsem totiž používal to neasynchronní
stahování, ale to aplikaci zasekávalo, tak jsem se dozvěděl, že
asynchronní stahování aplikaci zasekávat nebude. Myslel jsem, že se to
nastavuje podobně jako normální neasynchronní stahování. Kdybych zjistil,
že je to tak složité, tak bych se do toho ani nepouštěl.
Proto tě prosím o poslední dvě věci:
if (Urls.Count == 0)
Udělal jsem to takhle a:
private void Completed(object sender, AsyncCompletedEventArgs e)
{
Urls.Remove(Urls.Keys.ElementAt(0));
if (Urls.Count > 0)
{
DownloadFile(Urls.Keys.ElementAt(0), Urls[Urls.Keys.ElementAt(0)]);
toolStripStatusLabel1.Text = "Stahuji Soubor1";
toolStripStatusLabel1.Text = "Stahuji Soubor2";
toolStripStatusLabel1.Text = "Stahuji Soubor3";
toolStripStatusLabel1.Text = "Stahuji Soubor4";
toolStripStatusLabel1.Text = "Stahuji Soubor5";
toolStripStatusLabel1.Text = "Stahuji Soubor6";
toolStripStatusLabel1.Text = "Stahuji Soubor7";
toolStripStatusLabel1.Text = "Stahuji Soubor8";
}
if (Urls.Count == 0);
{
const string message2 = "Instalace byla úspěšně dokončena!";
const string caption2 = "Dokončeno!";
var result2 = MessageBox.Show(message2, caption2,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
Toolstripstatusy i tak nefungují
MessageBox sice ano, ale ukáže se po každém stažení souborů
Poradí tedy někdo?
Asi ne. Protože je evidentní, že netušíš co vlastně děláš, takže ti ani moc rady není. Leda bys poslal zadání aněkdo ti to třeba naprogramuje, ale nevím, proč by to dělal zadarmo.
Díky moc a ty toolStripStatusy? Díval jsem se výše ale u toho e. to ty soubory nenapsalo. Tak nevím co s tím.
AsyncCompletedEventArgs má vlastnost UserState, takže třeba v downloadfile si do ní uložíš třeba název souboru nebo číslo a pak v completed ji přečteš.
Zobrazeno 41 zpráv z 41.