- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Xiaomi Mi Box androidos médialejátszó 4K és HDR támogatással
- Philips LCD és LED TV-k
- TCL LCD és LED TV-k
- Nem indul és mi a baja a gépemnek topik
- Szünetmentes tápegységek (UPS)
- AMD Radeon™ RX 470 / 480 és RX 570 / 580 / 590
- Bambu Lab 3D nyomtatók
- Milyen belső merevlemezt vegyek?
- Házimozi belépő szinten
Új hozzászólás Aktív témák
-
vlevi
nagyúr
Az async kulcsszót arra találták ki, hogy ne neked kelljen kézzel írogatni a task.wait-et. Persze ezzel részben elrejti előled a C# a valódi működést, ami kavarodást tud okozni akkor, ha az ember nincs tökéletesen tisztában az async működésével.
Ha te várod meg a task lefutását, akkor csak csak a task fut egy külön szálon.
Azonban onnantól kezdve, hogy async-t használsz, minden átmegy egy másik threadre, vagyis, nem a program fő szálán fut, és csak akkor tér vissza a program fő szálára, ha a te metódusod teljesen lefutott.
webes alkalmazásnál, MVC-nél ez egy jó dolog, mert a fő thread csak korlátozott számú webrequestet tud egyszerre kiszolgálni, és, amíg minden a fő szálon fut, addig a többi webes kliens csak vár. Pl. van egy fél másodperces adatbázis műveleted, akkor ez azt jelentené, (async nélkül), hogy a webszervered fél másodpercenként 1-1 klienst tudna csak kiszolgálni. async használata esetén a teljes metódushívás egy új threadben folytatódik, a webszerver fő szála szabaddá válik, és fogadhatja a következő kérést a kliensektől. -
Peter Kiss
őstag
Biztos vagyok benne, hogy rosszul van szervezve a kódod parallel/async-await/connection close és egyebek (counter++ parallel-ben izgalmas lehet) kapcsán is, főleg, ha látod, hogy mindig ~250. vagy 500. elemnél hal meg.
https://stackoverflow.com/questions/19189275/asynchronously-and-parallelly-downloading-files - teljesen hasonló, talán segít.
-
sztanozs
veterán
Majdnem egy évvel ezelőtt is próbáltunk már lebeszélni a WebClient-ről... Ennyi idő alatt se sikerült váltani?
-
Szabesz
őstag
"Ahogy vártam, ugyan az a hiba, így is:
await Task.Run(() => { new InstLogic().LetsDoThis(gemail.Text, gepassword.Password, destination); }); és itt elszáll."
Persze, hogy elszáll, hiszen egy UI száltól különböző szálon próbálsz meg hozzáférni egy UI elem csak UI szálról elérhető
property
-jéhez:gemail.Text
<- ez itt tippre egy aMainWindow
-on lévőTextBox
gepassword.Password
<- ez meg egyPasswordBox
Tényleg, átolvasni, és értelmezni, mert enélkül marha nehéz: Threading model.
#8325 és a fenti alapján mostmár remélem kezd összeállni a kép, mi mikor miért nem megy.
-
Szabesz
őstag
"Azt írja ki, amit bemásoltam. Semmi többet."
Igen, pontosan ott írja, csak értelmezni kell: "The calling thread cannot access this object because a different thread owns it.". Elolvastad amit linkeltem a threading-ről?
"A linkelt megoldásban például az nem, hogy a this.-nek nincs Dispatcher-e."
Melyikthis
-nek? Nyilván mindegyiknek nem lesz, de a szóban forgóthis
-nek van. A te esetedben aclass MainWindow : Window
példánynak lesz ilyenproperty
-je.
Bárhol máshol kézenfekvően tudod használni aApplication.Current.Dispatcher
példányt.Magától csak úgy nem fog kétszer meghívódni, de ezt a kódod teljes ismerete nélkül senki sem fogja megmondani pontosan miért történik.
Egy kicsit jobban el kellene mélyedned a fentebb linkelt témákban, mert azok alap ismerete nélkül rengeteg probléma fog még megtalálni.
A fenti példáknál feltételeztem, hogy WPF alkalmazásról van szó (többinél sem tér el jelentősen).
-
Szabesz
őstag
Egyfelől írja a kivételben, hogy mi is pontosan a baja, másfelől meg rákeresve google első találatban megoldás is van.
Ajánlott átolvasni: Threading Model, azon belül ami most téged érint: Dispatcher, abból is pl Invoke(Action)
Ha meg már
Task.Run
, akkor sokkal inkábbawait Task.Run
, a gomb eseménykezelő függvény megasync void
. -
togvau
senior tag
Dispatcherezés megvan, csak az nincs, hogy hogy indítsak a gui Button_Click-jéből GUI-t nem blokkoló feladatot (a fő metódust ami végez mindent, letöltést, stb) Task.Run-al "The calling thread cannot access this object because a different thread owns it.", new Thread(() => -al egyszer sikerült, másodszor már ugyan azt a hibát dobálja...
Ja és ráadásul ezt az osztályt a GUI konstruktora példányosítja, szóval nem tudom hogy lehet másik thread a gazdája...
-
Froclee
őstag
UI-t csak UI thread-ről tudsz updatelni, Dispatcher-rel. Amúgy exceptionre dobsz egy google-t ki is hozza.
Hasonló kérdés volt 2 hónapja: [link]"Na meg az onclick által meghívott háttérlogika metódus blokkolja a GUI-t amíg az be nem fejezi."
Nem akarok bunkónak tűnni, de ezt nem egyszer leírtuk neked (pl itt és itt is volt figyelmeztetés).
(#7834) togvau: C#-ban getter setter láthatóságot lehet állítani.
-
Szabesz
őstag
Azért írtam Parallel-lel, mert láthatóan valamit háttérben akartál csinálni, amit nem vártál be (
Task.Factory
await
vagy bármi egyéb nélkül (aminek következtében az utolsó néhány unzip eredménye hibás lesz, vagy egy szép 0 byte-os file)). De akkor legyen egyszálas,ServicePointManager.DefaultConnectionLimit
állítás nélkül:using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//ServicePointManager.DefaultConnectionLimit = int.MaxValue;
var files = new[]
{
new Uri("http://ipv4.download.thinkbroadband.com/10MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/10MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/10MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com/10MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/20MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/20MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com/50MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/50MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/50MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com/100MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/100MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/100MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com/200MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/200MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/200MB.zip")
};
Console.WriteLine("Start");
foreach(var file in files)
{
var tempFile = Path.GetTempFileName();
using (var wc = new WebClient())
{
Console.WriteLine($"Starting download: {file} to {tempFile}...");
wc.DownloadFile(file, tempFile);
Console.WriteLine($"End download: {file}, local path: {tempFile}");
}
//File.Delete(tempFile);
}
Console.WriteLine("End");
}
}
}Ez nálam szintén folyamatosan tölt, nem malmoz két letöltés között.
A probléma eredete valószínűleg az, hogy kapcsolatokat nyitsz, amiket nem, vagy nem megfelelően zársz le, így a connection limit betelik, és megvárja egynek a felszabadulását (esetünkben valószínűleg timeout-ját). De mivel még nem láttunk teljes (minta) forduló kódot elejétől a végéig, csak részleteket, így nehéz megmondani a pontos okokat. Csinálj egy egyszerű példát, amin előáll a probléma, és arra már egyszerűbb gyógyírt mondani.
-
Szabesz
őstag
Csináltam egy ConsoleApp példát:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
ServicePointManager.DefaultConnectionLimit = int.MaxValue;
var files = new[]
{
new Uri("http://ipv4.download.thinkbroadband.com/10MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/10MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/10MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com/10MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/20MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/20MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com/50MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/50MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/50MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com/100MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/100MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/100MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com/200MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:81/200MB.zip"),
new Uri("http://ipv4.download.thinkbroadband.com:8080/200MB.zip")
};
Console.WriteLine("Start");
Parallel.ForEach(files, file =>
{
var tempFile = Path.GetTempFileName();
using (var wc = new WebClient())
{
Console.WriteLine($"Starting download: {file} to {tempFile}...");
wc.DownloadFile(file, tempFile);
Console.WriteLine($"End download: {file}, local path: {tempFile}");
}
//File.Delete(tempFile);
});
Console.WriteLine("End");
}
}
}Ez szépen kipörgeti amit a netem bírt, és párhuzamosan tölti le a minta fájlokat.
Több gond van a bemásolt kódoddal (mindamellett, hogy a teljesen nem másoltad be, ezért az összkép sem lehet teljes a működésről, és vannak benne zavaros dolgok):
- using-ot kellene használni
- Task.Factory.StartNew pedig el van indítva, de sehol sincsen bevárva. Task.Run javallottabb, illetve az async-await kulcsszavak használata. De ha még nagyon új a C#, lehet hanyagolni kellene egyelőre.
- AConvertToStream
környékén is valószínűleg voltak problémák, nem olyan triviális az átalakítás.
-ServicePointManager.DefaultConnectionLimit
értéke alapból 2, ha párhuzamos kérésekkel szeretnél dolgozni, érdemes átállítani.Másolj be egy teljes (működő, forduló) példát, hogy meg lehessen találni a pontos hibát. De valószínűnek tartom, hogy a fentiek egyikének hibás használata az okozó.
-
martonx
veterán
Pont ez a lényeg. Ha valami async, akkor az adjon vissza Task-ot. Viszont bármikor odabiggyeszteheted a .Result-ot az async metódusod meghívásának a végére, és máris normál változót fogsz visszakapni, mert látom ez a mániád.
Azaz pl. MyMethodAsync()-et kétféleképpen tudod használni:
1. szép async módon:
var a = await MyMethodAsync();2. csúnyán direktben syncesítve vállalva az esetleg háttérbeli async problémákat, ha egyébként minden más metódusod async fut:
var a = MyMethodAsync().Result;Azaz ha mindenképpen "szép" változó típust akarsz visszakapni a .Result-al bárhol rövidre tudod zárni az asyncosítást.
-
martonx
veterán
Nem tartom jó jelnek, hogy a static metódusodban mindig újból csinálsz egy webclient-et. Ez lehet, hogy egy szálon nem okoz gondot, több szálon viszont simán lehet, hogy összeakad valami valahol..
A helyedben a webclient-et egy példányban hoznám létre, és azt használnám újra és újra.Másrészt webről fileok letöltésénél a szűk keresztmetszet úgyis a sávszélesség, nem pedig a processzor kihasználtság, szóval szerintem ez az a tipikus helyzet, ahol felesleges párhuzamosítással felesleges komplexitást hozol be a rendszerbe, nulla hozzáadott értékkel.
Majd amikor a fileokat parsolni akarod, vagy mittudomén, ott lesz értelme a párhuzamosításnak, de itt most éppen nincs értelme. -
togvau
senior tag
Ha várok 1 percet, akkor dob egy webexception "The operation has timed out"-ot a
private static Stream ConvertToStream(string fileUrl)
{
try
{
if (DEBUG) Console.WriteLine("ConvertToStream: "+fileUrl);
return new WebClient().OpenRead(fileUrl);
}
catch (Exception ex) {
throw ex;
}
}
És így kiderül melyik fájlnál akad el, de a probléma az, hogy a dobott linket böngészőbe írva, simán letöltődik a fájl, és pont ugyanonnan hasonló fájlok (még nagyobbak) letöltése is simán megy a C# programból is. Gyak 21 fájlt kéne letöltenie, és a 19.-nél akad el. Ha nincs párhuzamosság, akkor végigmegy. -
sztanozs
veterán
[link] - egy darab pipát kell dobni az elején, ha mindent szeretnél elkapni. És amúhy miért jó, ha kidumpolja az exception-t és leáll? Nem értelmesebb elkapni a kivételt úgy, hogy meg tudd nézni a tényleges kontextust, le tudd csekkolni az összes változót, példányosított osztályt, stb???
Erre a Parallel.ForEach-re dobhatnál egy példát. Lehet, hogy csak a változókezeléssel van gond.
-
amargo
addikt
ctrl + .
De felajánlja csak még nem tudod, hogy mit és hol. [link]De ebből érdemes elindulni még: [link]
Exception: gyanítom a View Details-ra még soha nem kattintottál az exception ablakba.Nekem csak ez szúrt, szemet, hogy nem értesz az IDE-hez és fikázod. Több "hobby" programozó barátom is maguktól rájöttek ezekre. Fura.
A programozásban majd más segít, ha akar. -
lord.lakli
őstag
-
amargo
addikt
ctrl-space-re nem tudja megfelelő usingot beszúrni
tudja, vagy itt most gondolatolvasást vársz (?), még azt is kiírja, hogy névütközés van és válaszd ki melyikre is gondoltál, persze, ha nincs ütközés, akkor egyből berakja. De, ha egy példát mutatsz az még érdekes lehet.nem tud normális hibaüzenetet sem megjeleníteni ha valamelyik paraméter rossz
Itt megint user errort érzek, még soha nem volt ilyen gondom tekintve, hogy egy manage-d nyelvről beszélünk, mutass egy példát kérlek.Na meg néha újra kell indítani, mert beragad minden, semmit se csinál kiegészítésre, és a javított hibák aláhúzása is megmarad amíg újra nem indítom.
Igaz 2013-at csak kb 3 évig használtam, így lehet ez idő alatt valami elkerülte a figyelmem. Ha teli pakolod mindenféle 3party kiegészítővel azok tényleg összetudnak akadni, de bevallom régóta tudom, hogy az extension-ök összetudják kuszálni, ezért csak olyanokat rakok fel, amik megbízhatóak.
Nálam a 2015-ös csinált hasonlót, amikor 550 projektes sln-el kellett dolgozni.Egyedül a 2017-ben csavartak egy kicsit a csproj-on, amit nem muszáj elvégezni. Minek teszel fel SQL server-t, ha nincs rá szükséged?
eclipsbe bevallom nem merek beleszólni, azt csak 4 éve használom.. sajnos jó párszor kell.
(#7737) togvau:
Pont erre írtam, hogy még nem értesz hozzá, ez nem szemre hányás. Én utoljára using-ot '08-ba írtam be kézzel.. -
togvau
senior tag
Érdekes fejlemény, de ha átlépem a 00-kat readByte()-al, akkor beolvassa a stringet
Tehát így működik:
reader.ReadByte();
hashlink = reader.ReadString();
reader.ReadByte();
string mpass = reader.ReadString();
//soronként a fájl végéig˘˘
reader.ReadByte();
string user = reader.ReadString();
reader.ReadByte();
string pass = reader.ReadString();
reader.ReadByte();
string id1 = reader.ReadString();
reader.ReadByte();
string id2 = reader.ReadString();
bool notify = reader.ReadBoolean(); -
togvau
senior tag
Na sikerül dekódolni fejben, szóval. Minden string előtt van egy #00, és még egy hex szám ami a string hosszúságát jelöli (nem tudom, hogy byte e vagy karakter, de mivel nincsenek speciális karakterek ezért ebben az esetben a byte és karakterszám az ugyan az) , és ez után jön maga a string.
-
sztanozs
veterán
byte vs sbyte - a C# mindenhol byte-tal számol az sbyte csak speciális helyekre kell. De ha a Java tényleg signed byte-ot ad vissza (-128 - 127), akkor persze ezzel mókolni kell (de ez ugye csak reprezentáció - egy fájlba/stream-be mindegy, hogy byte-ként vagy sbyte ként írsz, a végeredmény ugyanaz lesz.
másrészt nekem úgy rémlik, hogy a GZip nem ZLib kompatibilis, nem is csodálkozom, hogy hibát dob.
A deflate pedig csak raw deflate bytestream-re használható, a headereket le kell vágni.ZIP-re külső csomagokat érdemes használni: [link]
-
sztanozs
veterán
Próbáld meg az AES-t (vagy AESManaged-et) használni a Rijndael helyett, és úgy felkonfigurálni, ahogy a példában van.
Ráadásul a Java-s megoldás nem közvetlenül a key-t használja, hanem egy abból derivált (PBKDF2WithHmacSHA1) kulcsot, amihez kell salt is:int iterations = 128;
Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(enc_key, salt, iterations);
byte[] key = rfc2898.GetBytes(32);Ezt próbáld meg illeszteni a kódodhoz.
-
sztanozs
veterán
Itt is van: CryptoStream, még példa is van a cikk alján.
-
sztanozs
veterán
-
sztanozs
veterán
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Autós topik
- Revolut
- Mielőbb díjat rakatnának a görögök az olcsó csomagokra az EU-ban
- Xiaomi Mi Box androidos médialejátszó 4K és HDR támogatással
- Xbox tulajok OFF topicja
- C++ programozás
- Philips LCD és LED TV-k
- Nintendo Switch 2
- TCL LCD és LED TV-k
- További aktív témák...
- Azonnali készpénzes INTEL CPU AMD VGA számítógép felvásárlás személyesen / postával korrekt áron
- Telefon felváráslás!! iPhone 15/iPhone 15 Plus/iPhone 15 Pro/iPhone 15 Pro Max
- ÁRGARANCIA! Épített KomPhone Ryzen 7 5800X 32/64GB RAM RX 7800 XT 16GB GAMER PC termékbeszámítással
- 115.000 ft -tól Országosan a legjobb BANKMENTES részletfizetési konstrukció! ASUS ROG Strix G18
- BESZÁMÍTÁS! 4TB Samsung 870 EVO SATA SSD meghajtó garanciával hibátlan működéssel
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest