IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nemůžu číst z nově vytvořeného a přepsaného souboru

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
iceman980
Člen
Avatar
iceman980:26.10.2020 13:40

Můj program vytvoří soubor ze Streamu v %TEMP% a pak z něj udělá SHA256 sum.
Problém nastane při spuštění, kdy dojde k vyvolání metody GetSHA256From­Stream.
Ta pak zavolá metodu WriteStreamToFile a ONU METODU, která vyhazuje error GetSHA256.

--- Chyba v metodě GetSHA256:
System.IO.IOEx­ception: The process cannot access the file
'C:\Users\WS1\Ap­pData\Local\Tem­p\test.ttttt'
because it is being used by another process.

public static string GetSHA256FromStream(Stream s) {
  string _tpath = Helper.GetTEMPPath("test.ttttt"); // vrátí %TEMP%\\test.ttttt
  Helper.WriteStreamToFile(s, _tpath);
  return Checksum.GetSHA256(_tpath, true);
}

public async static void WriteStreamToFile(Stream s, string outpath) {
  try {
    FileStream fStream = File.Open(outpath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
    s.Seek(0, SeekOrigin.Begin);
    await s.CopyToAsync(fStream);
    fStream.Close();
  }
  catch(Exception e) {
    return;
  }
}

public static string GetSHA256(string text, bool isFile = false) {
  SHA256 sha256 = SHA256.Create();
  byte[] hash;
  if (isFile) {
    FileStream stream = File.OpenRead(text);
    hash = sha256.ComputeHash(stream);
  }
  else {
    byte[] textBytes = Encoding.Default.GetBytes(text);
    hash = sha256.ComputeHash(textBytes);
  }
  return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}

Zkusil jsem: Možná ani nechápu celou podstatu async/await, zda-li je vůbec potřebná při vytváření souborů, tudíž můžu říci, že jsem zkoušel vše, ale ani jedno nefungovalo.

Chci docílit: Jen aby můj program uměl vytvářet soubory s obsahem a hned z něj číst. :-?

 
Odpovědět
26.10.2020 13:40
Avatar
iceman980
Člen
Avatar
iceman980:26.10.2020 14:13

Ještě pro doplnění bych chtěl uvést toto.

 
Nahoru Odpovědět
26.10.2020 14:13
Avatar
Jan Kerhart
Člen
Avatar
Jan Kerhart:26.10.2020 15:31

Ahoj,
problém je v tom, že ten await operátor neblokuje celé vlákno. On pouze "naplánuje" pokračování za ním až na poté, co se dokončí Task v jeho operandu a předá řízení zpátky metodě, která async metodu (zde WriteStreamToFile) zavolala (zde GetSHA256From­Stream).
Jednoduše řečeno, při čekání na CopyToAsync se už zároveň pokračuje ve vykonávání Checksum.GetSHA256 a ta se snaží přistoupit k již otevřenému souboru. To je celá podstata async/await, pokud by await zablokoval celé vlákno, tak by používání asynchronní operace nedávalo žádný smysl.

Tudíž ty musíš awaitovat i metodu WriteStreamToFile. Nebo nejjednodušší řešení je zde nepoužívat asynchronní CopyToAsync a vykonat vše synchronně pomocí CopyTo, ale to zaleží na dané aplikaci, zda-li je toto přijatelné.

Editováno 26.10.2020 15:33
Akceptované řešení
+20 Zkušeností
Řešení problému
 
Nahoru Odpovědět
26.10.2020 15:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.