You are browsing the archive for .NET.

ASP.NET 5 tulee – oletko valmis?

28.9.2015 in HTML5, Sovelluskehitys by Toni Ylärinne

Uusi ASP.NET 5 on hyvin suuri muutos koko Microsoftin Web-sovelluskehityksen teknologiastackissä. Ensinkin se on erillinen rinnakkainen versio ASP.NET 4.6 rinnalla ja rakennettu Open Source -ratkaisuna uuden .NET Coren päälle. (ASP.NET 5 toimii kyllä tarvittaessa myös .NET 4.6:den päällä) ASP.NET 5 onkin Microsoftilta merkkittävä siirto avoimen lähdekoodin maailmaan.

Aspnet5Itse .NET Core on avoimen lähdekoodin projekti samoin kuin ASP.NET 5 ja tulevaisuuden ASP.NET 5 -ratkaisuja voidaan siis ajaa Microsoftin palvelinten lisäksi myös Mac- ja Linux-järjestelmissä. Tämä tarkoittaa myös sitä, että sovelluksia ei tarvitse Windows-ympäristössä enää hostata IIS:n päällä vaan ne voidaan hostata omassa prosessissaan. Tämä ei ole ainut asia, missä ASP.NET 5 laittaa kampoihin node.js:lle, uusi HTTP-request pipeline mahdollistaa paremman suorituskyvyn. Kehittäjä pystyy kustomoimaan, mitä komponentteja pyynnön käsittelyssä tarvitaan.

Mitä uutta kehittäjä saa?

MVC6 on uusi yhtenevä ohjelmointimalli sekä palvelinpään HTML UI:n luomiseen, että REST-palvelujen rakentamiseen ja mm. Razor-syntaksi on kokenut parannuksia, jotka näkyvät parempana intellisense tukena Visual Studiossa. Visual Studio 2015:sta on myös tuki Web-kehityksessä yleistyneille tekniikoille kuten bower:lle web-sovelluksen client-pään riippuvuuksien hallintaan ja gulp:lle ja gruntille kehitysprosessin automatisointiin mm. LESS/SASS/TypeScript-kääntämiset ja JavaScript-pakkaamiset.

ASP.NET 5 on Beta 7 tällä hetkellä. Beta 8, jossa kaikki uudet toiminnallisuudet pitäisi olla toteutettuna julkaistaan näillä näkymin 5.10.2015. Versio 1.0 pitäisi olla ulkona Q1/2016.

Miten pääset alkuun? Lataa ja asenna Visual Studio 2015 RTM ja ASP.NET 5 Preview. Lisätietoja: http://www.asp.net/vnext

Aiheeseen liittyvä Sovelton kurssi .NET palveluiden ohjelmointi; NET Core 5 ja .NET 4.6 löytyy myös!

Visual Studio 2015, uusi versio tuotannossa

2.9.2015 in Sovelluskehitys by Heikki Raatikainen

Taas on uusi Visual Studion versio tullut tuotantoon ja se sisältää paljon uusia ominaisuuksia vaikka ensi käynnistyksellä kaikki näyttää kovin samanlaiselta ja siirtyminen uuteen versioon tapahtuu helposti. Visual Studio 2015 toimii kehittimenä myös IOS- ja Android-sovelluksille Windowsin lisäksi.
Read the rest of this entry →

Rinnakkaisuus ja .NET

24.2.2013 in Sovelluskehitys, Visual Studio 2012 by Heikki Raatikainen

Rinnakkaisuus ja .NET

.NET on tarjonnut rinnakkaisuuden toteuttamiseen paljon palveluita jo heti ensimmäisestä versiosta lähtien. Thread-objektilla säikeiden hallinta on hyvin lähellä sekä Win32apin palveluita että Javan säiekäsittelyä. ThreadPool ja delegatin begin/endinvoke olivat ensimmäiset .NET spesifit tekniikat. .NET 2.0 toi mukanaan backgroundworker-olion joka yksinkertaisti joiltakin osin rinnakkaisuuden tekemistä, mutta ei tuonut mitään lisäominaisuuksia joita ei jo muutenkin pystynyt toteuttamaan.

Sitten ei tapahtunutkaan pitkään aikaan oikeastaan mitään rinnakkaisuuden osalta .NETssä ennen kuin vasta versiossa .NET 4.0. Tässä versiossa oli mukana uusia synkronointiluokkia sekä Task-luokka joka on keskeinen osa TPL-kirjastoa (Task Parallel Library). Task on enemmän looginen käsite kuin tekniikka, ohjelmoinnissa siirrytään tekemään loogisia toimintoja (Task) joita suoritetaan mahdollisuuksien mukaan rinnakkain. Perinteinen ’kuinka käynnistän säikeen’ -ajatusmalli jää vähemmälle merkitykselle. Task suorittaa jonkin metodin joten siinä suhteessa se ei poikkea paljoakaan säikeestä.

Olin aluksi sitä mieltä että Task ei tuo mitään lisäarvoa kun osaan toteuttaa rinnakkaisuutta perinteisillä tavoilla. Jouduin kuitenkin korjaamaan omia mielipiteitäni ja käsityksiä asiasta aika nopeasti. Task on erittäin merkittävä tapa tehdä rinnakkaisuutta. Jo senkin takia että .NET itsessään käyttää paljon Task-luokkaa ja toisekseen siksi että Task tarjoaa paljon palveluita joita ei enää tarvitse itse toteuttaa source-koodissa.

Otetaan tähän esimerkki WPF-sovelluksesta. Käyttöliittymää ei saa päivittää kuin se säie joka on instantioinut käyttöliittymäkomponentin. Jos siis taustalla tehdään laskentaa tai vaikka tietokantahakuja, ei kyseinen säie saa suoraan päivittää käyttöliittymää. Tähän löytyy  toki ratkaisumallit sekä WinForms- että WPF-kirjastoista mutta Task-käsitteen avulla päivityksestä saadaan vielä helpompaa. Seuraavan esimerkin WPF-sovelluksen painonapin click-käsittelijä luo Task-olion joka suorittaa pitkäkestoisen toiminnon slowFunc. Kun se on valmis niin jatketaan metodilla joka päivittää käyttöliittymää ja on toimiva koska Taskia ajetaan käyttöliittymän skedulerin kontekstissa. Ja tämä on vain yksi esimerkki miten Task yksinkertaistaa koodia.

private void B_Click(object sender, RoutedEventArgs e) {

button1.IsEnabled = false;

// haetaan UI-säikeen konteksti käyttöön:

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

var t = Task<int>.Factory.StartNew(() => slowFunc(1, 2));

t.ContinueWith(x => {

label1.Content = ”tulos: ” + t.Result.ToString();

button1.IsEnabled = true;

}, uiScheduler

);

}

.NET 4.5 lisäsi valikoimaan async/await varatut sanat joilla helpotetaan koodaajan arkea. Niiden avulla pystytään kirjoittamaan metodin koodi kuten se olisi synkroninen mutta todellisuudessa kääntäjä tuottaa koodia jolla metodi onkin asynkroninen. Seuraava esimerkki ei tapa käyttöliittymää vaikka metodin haeOtsikotAsync suoritus kestäisi pitkään.

private async void B_Click(object sender, RoutedEventArgs e){

Title = ”Haetaan uutisotsikoita…”;

Otsikot = new ObservableCollection<string>(await haeOtsikotAsync());

// B__Click:n kutsuja pääsee suoritukseen

    // è sanomajonosta käsitellään seuraavat sanomat

    // è käyttöliittymä pysyy toiminnassa

    // ja kun haeOtsikotUudellaTekniikkalla on valmis

    // koodin suoritus jatkuu tästä

Title = ”Löytyi ” + Otsikot.Count + ” kpl otsikoita”;

}

private Task<List<string>> haeOtsikotAsync() {

Task<List<string>> t = new Task<List<string>>(() => {

return uutisPalvelu.HaeOtsikot();

});

t.Start();

return t;

}

Rinnakkaisuutta tarvitaan siis tyypillisesti käyttöliittymällisissä Client-sovelluksissa. Mutta entäpä web-sovellukset? Aivan samasta syystä kuin client-sovelluksissa ei rinnakkaisuutta tehdä web-sovelluksen server-koodiin, selaimessa toimiva JavaScript on asia erikseen. Server-koodissa rinnakkaisuus ei lisää sovelluksen nopeutta yksittäisen käyttäjän kannalta mutta jos sovelluslogiikassa on paljon kohtia joissa odotetaan esimerkiksi IO:n päättymistä tai tietokantahakuja niin toteuttamalla palvelupyynnöt asynkronisesti saadaan maksimoitua sovelluksen ja palvelimen suorituskyky koko sovelluksen kannalta. Vähemmillä serverin resursseilla pystytään enemmän pyyntyjä selaimelta. Tästä aiheesta voisinkin kirjoittaa jatkossa toisen ja syvemmälle menevän blogi-artikkelin, aiheena voisi olla ASP.NET MVC:n asynkroniset kontrollerit ja actionit.

Pidän rinnakkaisuudesta luennon Microsoftin Techdays 2013 seminaarissa (5.-6.3.2013), jos sinulla sattuu olemaan jo lippu tähän loppuunmyytyyn tilaisuuteen niin kannattaa tulla kuuntelemaan luento.