» »

C# .net class vs .net core async await issue

C# .net class vs .net core async await issue

detroit ::

Živjo
Naredil sem nek testni api za čvek z Bitstamp apijem(samo testni app za test .net core)

Imam še winform ki uporablja ta api.

 private async void button2_Click(object sender, EventArgs e)
        {           
            var balance = await API.GetBalanceV2Async();
            label1.Text = "Done balance";
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            var ticker = await API.GetTickerAsync("ethusd");            
            label1.Text = $"Done ticker {ticker}";
        }


In klik katerega koli gumba mi zablokira GUI če je napisano v coru (word by word isto) če je pa .net classic pa deluje.
Vprašanje sedaj je ali je to kakšna specifika .net core? Ga še nisem uporabljal namreč. (Testiral sem .net core 2.2 in 3.0 beta, za classic test pa mislim da 4.62)
Skero

Lonsarg ::

Ne vem kaj točno ti uporabljaš za UI, specifika ASP.Net Cora naj bi recimo bila da MANJ deadlocka, ker ne uporablja SyhronizationContex:
https://blog.stephencleary.com/2017/03/...

kingsix ::

Kaj pa dela tale API? Če daš v podpis metode async še ni magično vse skupaj asinhrono.

detroit ::

@Lonsarg winform .net core 3.0 (tisti ki ne dela)

@kingsix primer
 public async Task<string> GetTickerAsync(string ticker)
        {
            var response = await client.GetAsync(endpoint + ticker);
            var tickerJson = await response.Content.ReadAsStringAsync();
            return tickerJson;
//deserialize and return Task<ticker>
        }



sumim da je kriva 3.0 beta ker forme niso še popolno podprte ...or something
Skero

Zgodovina sprememb…

  • spremenil: detroit ()

win64 ::

kingsix je izjavil:

Kaj pa dela tale API? Če daš v podpis metode async še ni magično vse skupaj asinhrono.

Točno tako. Async metoda ne zagotavlja, da se bo nekaj zaganjalo vzporedno s trenutnim Thread-om. Recimo v ASPNET zlahka narediš deadlock, če čakaš na rezultat z GetResult.

Lahko poizkusiš z BackgroundWorker, če bo kaj boljše. Drugače pa ustvari task v svojem Task factory. To ti garantira ustvarjanje nove niti.
https://docs.microsoft.com/en-us/dotnet...

Zgodovina sprememb…

  • spremenil: win64 ()

detroit ::

@win64 razumem da ne zagotavlja nič, v primeru da ni prav zastavljeno. Mislim, da v tem primeru ne bi smelo priti do težav. Če pogledaš zgoraj tudi na .net classic deluje ista koda. Background worker sem nazadnje uporabljal 5let nazaj, mislim da v tem primeru res ni potrebe po njemu.
Skero

win64 ::

Ne poznam implementacije Winforms v .NET Core, lahko da je še kakšen bug ali pa je kakšen specifičen način klicanja. Kaj pa če poizkusiš narediti kak fake task, recimo samo en sleep noter.

Offtopic: zanima me, kaj je razlog da si se odločil za winformse v netcore. Je sploh kakšna prednost glede na to da deluje samo pod windowsi?

detroit ::

@win64 z Task.Delay(5000) deluje. Zato sem pa tudi tu ker mi ni jasno kaj in zakaj kako...čisto možno tudi da httpclient async funkcije nedelujejo v .net coru 3.0 samo če me spomin ne vara je API v 2.2 ki je že stable. Zato sem tudi prišel sem z vprašanjem če je kakšna znana težava s corom, ker sm core noob:)


oldočil sem se za formo v coru ker se mi zdi da .net core z .net classic ne moreš ravno mešat...mogoče se motim?
Primer:
API core [ 3.0 | 2.2 ]
WINFORM za test apija .net classic
se mi zdi da nista ravno compatible? Nisem sprobal:)
Skero

Zgodovina sprememb…

  • spremenil: detroit ()

win64 ::

Lahko mešaš. Samo prvo moreš razumet še en termin: netstandard.
netstandard po domače določa minimalne funkconalnosti, ki jih mora framework podpirat.
Recimo .Net Framework 4.6.1 podpira netstandard 2.0, tako kot to podpira .Net CORE 2.0.
Tukaj je seznam kateri framework-i podpirajo kateri netstandard:
https://docs.microsoft.com/en-us/dotnet...

Kar pogosta praksa je, da se da funkcionalnost v ločen class library project. V tem projektu določiš, da podpiraš netstandard in bi knjižica morala delovati normalno na obeh.
Rahel zaplet nastane, če hočeš v knjižnici uporabiti funkcionalnost, ki je del samo .Net Framework (recimo aspnet). Ko boš prišel do tja, kar vprašaj.

detroit ::

mal po spominu brskam, ali bi moral potem za API izbrati .net standard ali kar pustim classic lahko?

drugače pa thx nisem vedel da se da mixat:)
Skero

dellon ::

win64 je izjavil:

Lahko mešaš. Samo prvo moreš razumet še en termin: netstandard.
netstandard po domače določa minimalne funkconalnosti, ki jih mora framework podpirat.
Recimo .Net Framework 4.6.1 podpira netstandard 2.0, tako kot to podpira .Net CORE 2.0.
Tukaj je seznam kateri framework-i podpirajo kateri netstandard:
https://docs.microsoft.com/en-us/dotnet...

Kar pogosta praksa je, da se da funkcionalnost v ločen class library project. V tem projektu določiš, da podpiraš netstandard in bi knjižica morala delovati normalno na obeh.
Rahel zaplet nastane, če hočeš v knjižnici uporabiti funkcionalnost, ki je del samo .Net Framework (recimo aspnet). Ko boš prišel do tja, kar vprašaj.


Full support za .Net standard 2 mislim da podpira šele 4.7.1. 4.6.1 pa preko shim-ov, kjer ti naštepa v projekt 20+ dodatnih dll-jev

detroit je izjavil:

mal po spominu brskam, ali bi moral potem za API izbrati .net standard ali kar pustim classic lahko?

drugače pa thx nisem vedel da se da mixat:)


Web api je classic ali pa .NET Core, standard je samo "dogovor" in ne framework

Zgodovina sprememb…

  • spremenil: dellon ()

win64 ::

Tako je, končna aplikacija je tako ali drugače vezana na določen framework. Tega se težko znebiš.
Lahko pa imaš skupno knjižico, ki deluje na več frameworkih. To je smisel netstandard.

Ne obstaja pa delni support za .Net standard. Ali je podprto ali ni.
Iz izkušenj ti povem, da pri 4.6.1 potrebuješ le en dodaten DLL (netstandard.dll ali nekaj podobnega).

Zgodovina sprememb…

  • spremenil: win64 ()

detroit ::

sicer nismo prišli do dna buggy .coru ampak bom stestiral pa javim ko bo čas thx vsem
Skero


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Visual Studio

Oddelek: Programska oprema
242968 (720) Invictus
»

Keylogger

Oddelek: Programska oprema
352615 (1342) Blisk
»

[UWP] [C#]

Oddelek: Programiranje
424165 (2195) BivšiUser2
»

net framework

Oddelek: Operacijski sistemi
151301 (727) Lonsarg
»

Mono Develop .net

Oddelek: Programiranje
102300 (1871) Lonsarg

Več podobnih tem