Kezdőoldal » Számítástechnika » Programozás » C# programomban egy formról...

C# programomban egy formról eltűnik a label. Megakad a thread, de nem szeretnék 2 szálat használni. Milyen megoldás lehetséges?

Figyelt kérdés

Sziasztok!


Készítek egy kis programot amellyel lehetőség van fájlokat másolni egy kiválasztott mappába. A File.Copy();-t használom ehhez. Szeretném, hogy amíg másolódnak a kiválasztott fájlok mutassak egy Dialog szerű Formot amin nemes egyszerűséggel csak egy Label van: "Másolás folyamatban". Maga a function jól működik, ha befejeződik a másolás akkor kiírja, hogy kész a másolás, de ha az elején megmutatnám ezt a kis szösszenet form-ot akkor a label text-je nincs ott, vjszont a helye az igen.

Ezt az okozza, hogy a fő szálat leakasztom a Copy idejéig? Lehetséges ezt úgy megoldani, hogy ne kelljen több szálon?


Előre is Köszönöm szépen.

FolderBrowserDialog fbd = new FolderBrowserDialog();

fbd.ShowDialog();


foreach (string item in FileContainer.SelectedItems)

{

----string selectedFileWithPath = Settings.FolderPath + "\\" + item;

----string copyToPath = fbd.SelectedPath + "\\" + item;

----File.Copy(selectedFileWithPath, copyToPath);

}

MessageBox.Show("Másolás kész");



2015. jan. 12. 22:08
 1/8 anonim ***** válasza:
A GUI-t és az időigényes műveletet mindig 1-1 külön szálra kell tenni. Mi baj van a több szállal?
2015. jan. 12. 22:27
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:
Azért nem akarom, mert nincs nem sok lényege van annak, hogy közben a GUI-n tud bármit is csinálni. Az lenne a lényeg, hogy a másolás mint állapot látszódjon a felületen, hogyha valaki új megy a géphez akkor ne akarja kikapcsolni vagy bármit.
2015. jan. 12. 22:34
 3/8 anonim ***** válasza:

Látod, hogy ha egy szálon vagy, befagy a GUI. Szét kell szedni.


Az, hogy most a júzernek megengeded-e hogy bizgetheti a GUI-t, egy tök másik kérés.

2015. jan. 12. 23:31
Hasznos számodra ez a válasz?
 4/8 SimkoL ***** válasza:
Próbálj meg a ciklusba beszúrni egy Application.DoEvents()-et.
2015. jan. 12. 23:48
Hasznos számodra ez a válasz?
 5/8 A kérdező kommentje:

Sorry, most nem lesz ekezetem.


Kiprobalom, majd a DoEvents-et, de egyenlore feltennem a szalas megoldashoz a kerdesem...


Szeretnem sajat kezzel a leheto legeslegegyszerubb modon megirni a dolgot. Igy probalkoztam


Loading form = new...

Thread t = new Thread(new ThreadStarter(Copy));

t.Start();



void Copy()

{

form.dispose ha kesz.

}....


Nemtom az osszes problemat leirni, de kb ezek voltak:

Masik threadrol nem lehet controlt allitgatni, Threaden futott a masolas, de a form azonnal eltunt... ilyesmi.


Esetleg erre van valami megoldas, lehet detektalni valahogy ha kesz a thread?

Van az androidhoz hasonlo AsnycTask itt?

2015. jan. 13. 00:43
 6/8 anonim ***** válasza:
Van hát. Async metódusba rakd bele a másolást (public async void ...) [vigyázz mert vagy void vagy Task a visszatérítési érték, de a task lehet Task<string> is vagy egyebek..). Én a helyedben az MSDN által javasolt FileStream-el másolnám át (egy FileStream a forrásfájl, egy másik FileStream a célfájl), majd a végére egy await masolandoFS.CopyToAsync(celfajlFS);
2015. jan. 13. 14:03
Hasznos számodra ez a válasz?
 7/8 A kérdező kommentje:

Tegyük fel, hogy egy junior próbál minél előbb megoldást találni egy problémára. Ennek a függvényében a következő kód mennyire helyes/helytelen?


A legfőbb kérdésem az lenne, hogy így a Thread-del mi történik? Abortolódik vagy futkos tovább?


"pasteb!n.com/aGsgnDPF"


Nem tudtam linkként csatolni:

"Sajnálom, de válaszodban nem használhatsz linkrövidítőket, mint amilyen a pastebin.com linked!

Kérlek az eredeti linket másold a rövid változat helyére!"

2015. jan. 14. 00:30
 8/8 anonim ***** válasza:

Nem otthoni gépemről vagyok most, ezen nincs VS, nem tudtam tesztelni, de most így ez a kód jött össze, próbáld meg működik-e:


public async Task CopyFiles(){

foreach(string item in SelectedItems){

string selectedFileWithPath = Settings.FolderPath + "\\" + item;

string copyToPath = DestinationFolder + "\\" + item;

lblCurrentCopyingFilename.Invoke(new SetFileNameLabelCallback(SetFileNameLabel), new object[] { item});

FileStream source = new File.Open(selectedFileWithPath,FileMode.Open);

FileStream dest = new File.Create(copyToPath);

await source.CopyToAsync(dest);

}


Erőltessük csak ezt az async dolgot mert hasznos csak ügyesen kell használni.


Meghívni meg úgy hogy:

Task task = new Task(CopyFiles);

task.Start();

2015. jan. 14. 21:06
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!