Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- XAML:
- <StackPanel Margin="20">
- <TextBlock Margin="10" FontSize="32" FontWeight="Bold" Name="ResultText">TESTI</TextBlock>
- <Button Margin="10" Click="Button_Click">Lataa videot</Button>
- <Button Margin="10">TESTINAPPI</Button>
- </StackPanel>
- <ListView.Resources>
- <MenuFlyout x:Name="allContactsMenuFlyout">
- <MenuFlyout.Items>
- <MenuFlyoutItem x:Name="Edit" Text="Edit" />
- <MenuFlyoutItem x:Name="Remove" Text="Remove" Click="Remove_Click" />
- </MenuFlyout.Items>
- </MenuFlyout>
- </ListView.Resources>
- C#:
- // ilman threadaamista tulee ongelma käyttöliittymän kanssa
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- DownloadVideoAsync();
- }
- public async System.Threading.Tasks.Task DownloadVideoAsync()
- {
- // testivideot otettu täältä: https://gist.github.com/jsturgis/3b19447b304616f18657
- List<String> videos = new List<String>();
- videos.Add("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/VolkswagenGTIReview.mp4");
- videos.Add("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4");
- // haetaan sovelluksen tallenuspaikka, ja luodaan uusi kansio videoille
- Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
- StorageFolder newFolder = await storageFolder.CreateFolderAsync("myvideos", CreationCollisionOption.ReplaceExisting);
- // tulostetaan konsoliin testaamista varten kansion polku
- Debug.WriteLine(storageFolder.Path.ToString());
- ResultText.Text = "Aloitetaan lataus.";
- // ensimmäinen tiedosto alkaa numerosta 1
- int fileNumber = 1;
- // luodaan web client
- var client = new WebClient();
- // ladataan yksitellen videot
- foreach (String video in videos)
- {
- ResultText.Text = "Ladataan videota " + fileNumber;
- Debug.WriteLine("Downloading video " + fileNumber);
- // jos käytössä BackgroundWorker, tämä pitää olla päällä
- //workerThread.ReportProgress(fileNumber);
- // lataa tiedosto ja tallenna se tallennustilaan
- client.DownloadFile(new Uri(video), storageFolder.Path.ToString() + @"\myvideos\video" + fileNumber + ".mp4");
- Debug.WriteLine(storageFolder.Path.ToString() + @"\myvideos\video" + fileNumber + ".mp4");
- // kasvata numeroa seuraavaa tiedostoa varten
- fileNumber += 1;
- }
- ResultText.Text = "Kaikki videot on ladattu.";
- }
- // säikeistäminen BackgroundWorkerilla (vanhentunut, valitettavasti
- public async System.Threading.Tasks.Task BigWorkBackground()
- {
- // luodaan worker
- BackgroundWorker workerThread = new BackgroundWorker();
- // tässä tapauksessa emme mahdollista säikeen peruuttamista
- workerThread.WorkerSupportsCancellation = false;
- // haluamme kuitenkin antaa välitietoja miten työ etenee
- workerThread.WorkerReportsProgress = true;
- // tässä määritetään koodi mikä ajetaan taustasäikeessä
- workerThread.DoWork += delegate (object s, DoWorkEventArgs args)
- {
- // simuloidaan hidasta koodia Thread.Sleepin avulla
- Debug.WriteLine("Vaihe 1");
- workerThread.ReportProgress(1);
- System.Threading.Thread.Sleep(4000);
- Debug.WriteLine("Vaihe 2");
- workerThread.ReportProgress(2);
- System.Threading.Thread.Sleep(4000);
- Debug.WriteLine("Vaihe 3");
- workerThread.ReportProgress(3);
- System.Threading.Thread.Sleep(4000);
- };
- // päivitetään tieto myös käyttöliittymään (XAML)
- workerThread.ProgressChanged += delegate (object s, ProgressChangedEventArgs e)
- {
- ResultText.Text = "Vaihe " + e.ProgressPercentage;
- };
- // kun DoWork on suoritettu loppuun
- workerThread.RunWorkerCompleted += delegate (object s, RunWorkerCompletedEventArgs args)
- {
- ResultText.Text = "Kaikki työt suoritettu!";
- };
- // käynnistä säie!
- workerThread.RunWorkerAsync();
- }
- public async Task TaskWorkBackground()
- {
- Debug.WriteLine("Aloitetaan työ");
- // jos haluamme Taskin sisällä päästä käsiksi UI Threadiin, eli käyttöliittymään, tarvitsemme Dispatcheria:
- await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
- ResultText.Text = "Aloitetaan työ.";
- });
- // simuloidaan kolme vaihetta, await-versio Thread.Sleepistä
- await Task.Delay(4000);
- await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
- ResultText.Text = "Vaihe 1";
- });
- await Task.Delay(2000);
- await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
- ResultText.Text = "Vaihe 2";
- });
- await Task.Delay(5000);
- await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
- ResultText.Text = "Vaihe 3";
- });
- await Task.Delay(1000);
- Debug.WriteLine("Kaikki työ tehty.");
- // jos haluamme Taskin sisällä päästä käsiksi UI Threadiin, eli käyttöliittymään, tarvitsemme Dispatcheria:
- await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
- ResultText.Text = "Kaikki työ tehty!";
- });
- }
- // event handlerissa, esim:
- var t = Task.Run(() => TaskWorkBackground());
- // suositeltavin tapa tiedon lataamisessa (tiedostosta toiseen, internetistä tiedostoon jne, input/output)
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- // käynnistäminen esim. event handlerissa:
- //var t = Task.Run(() => TaskWorkBackground());
- // alaviiva tarkoittaa "discardia" C#:ssa, eli tämä metodikutsu laitetaan pois muistista kun se on valmis
- _ = LaunchDownloadAsync();
- }
- public async Task LaunchDownloadAsync()
- {
- await AwaitBackgroundWork();
- }
- private async Task AwaitBackgroundWork()
- {
- Debug.WriteLine("Vaihe 1");
- ResultText.Text = "Vaihe 1...";
- await Task.Delay(3000);
- Debug.WriteLine("Vaihe 2");
- ResultText.Text = "Vaihe 2...";
- await Task.Delay(3000);
- Debug.WriteLine("Vaihe 3");
- ResultText.Text = "Vaihe 3...";
- await Task.Delay(3000);
- ResultText.Text = "Kaikki työ tehty!";
- }
- // tiedoston lataaminen netistä, await/async versio
- public async Task LaunchDownloadAsync()
- {
- await DownloadVideosAsync();
- }
- private async Task DownloadVideosAsync()
- {
- // haetaan ohjelman tallennuskansio Windowsista
- Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
- // luodaan apukansio "myvideos"
- // korvataan vanha kansio, jos se löytyy entuudestaan
- StorageFolder newFolder = await storageFolder.CreateFolderAsync("myvideos", CreationCollisionOption.ReplaceExisting);
- // tulostetaan testimielessä kansion sijainti konsoliin
- Debug.WriteLine(storageFolder.Path.ToString());
- // lisätään pari testivideota ladattavaksi listaan
- List<string> videos = new List<string>();
- videos.Add("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/VolkswagenGTIReview.mp4");
- videos.Add("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4");
- // pidetään muuttujassa yllä seuraavaksi tallennettavan videon numero
- int fileNumber = 1;
- // luodaan http-client, jolla voimme ladata internetistä dataa
- // joudumme awaitin vuoksi käyttämään tätä, sillä WebClient ei toimi awaitin kanssa
- // tämä johtuu siitä, että WebClient on itse toteuttanut säikeistämisen eri tavalla
- HttpClient httpc = new HttpClient();
- // käydään videot silmukassa läpi
- foreach (String video in videos)
- {
- // päivitetään tilanneviestit
- Debug.WriteLine("Start download: " + video);
- ResultText.Text = "Ladataan videota " + fileNumber;
- // ladataan videon sisältö tavutaulukkoon
- byte[] stringData = await httpc.GetByteArrayAsync(video);
- // tehdään uudelle videolle uusi tiedosto apukansioon (myvideos)
- Windows.Storage.StorageFile file = await storageFolder.CreateFileAsync(@"\myvideos\video" + fileNumber + ".mp4",
- Windows.Storage.CreationCollisionOption.ReplaceExisting);
- // kirjoitetaan videon sisältö uuteen tiedostoon
- await Windows.Storage.FileIO.WriteBytesAsync(file, stringData);
- // kasvatetaan numeroa seuraavaa tiedostoa varten
- fileNumber += 1;
- Debug.WriteLine("Download finished.");
- }
- ResultText.Text = "Kaikki videot on ladattu!";
- }
- // kielen vaihtaminen lennosta ohjelmassa
- private void Button_Click_1(object sender, RoutedEventArgs e)
- {
- // vaihdetaan kieli, ja ladataan Page uudestaan
- ApplicationLanguages.PrimaryLanguageOverride = "en-US";
- this.Frame.Navigate(typeof(MainPage));
- }
- // DATA ACCESS LUOKKA SQLITEÄ VARTEN
- // muista asentaa NuGetillä Microsoft.Data.Sqlite -kirjasto
- public static class DataAccess
- {
- // luodaan SQLite tietokanta tarvittaessa, jos sitä ei ole olemassa entuudestaan
- public async static void InitializeDatabase()
- {
- await ApplicationData.Current.LocalFolder.CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);
- string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
- using (SqliteConnection db =
- new SqliteConnection($"Filename={dbpath}"))
- {
- db.Open();
- String tableCommand = "CREATE TABLE IF NOT " +
- "EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
- "Text_Entry NVARCHAR(2048) NULL)";
- SqliteCommand createTable = new SqliteCommand(tableCommand, db);
- createTable.ExecuteReader();
- }
- }
- public static void AddData(string inputText)
- {
- string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
- using (SqliteConnection db =
- new SqliteConnection($"Filename={dbpath}"))
- {
- db.Open();
- SqliteCommand insertCommand = new SqliteCommand();
- insertCommand.Connection = db;
- // Use parameterized query to prevent SQL injection attacks
- insertCommand.CommandText = "INSERT INTO MyTable VALUES (NULL, @Entry);";
- insertCommand.Parameters.AddWithValue("@Entry", inputText);
- insertCommand.ExecuteReader();
- db.Close();
- }
- }
- public static List<String> GetData()
- {
- List<String> entries = new List<string>();
- string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
- using (SqliteConnection db =
- new SqliteConnection($"Filename={dbpath}"))
- {
- db.Open();
- SqliteCommand selectCommand = new SqliteCommand
- ("SELECT Text_Entry from MyTable", db);
- SqliteDataReader query = selectCommand.ExecuteReader();
- while (query.Read())
- {
- entries.Add(query.GetString(0));
- }
- db.Close();
- }
- return entries;
- }
- }
- // esim. SecondPage.xaml.cs:
- public SecondPage()
- {
- this.InitializeComponent();
- // haetaan uusimmat tiedot tietokannasta
- Output.ItemsSource = DataAccess.GetData();
- // jos tavallinen luokka, metodia kutsutaan olion kautta:
- //DataAccess da = new DataAccess();
- //da.ReadData();
- // jos staattinen luokka, oliota ei ole, ja kutsutaan suoraan luokan kautta
- //DataAccess.ReadData();
- }
- private void AddData(object sender, RoutedEventArgs e)
- {
- // lisätään uusi rivi tietokantaan ja haetaan tiedot uusiksi käyttöliittymään
- DataAccess.AddData(Input_Box.Text);
- Output.ItemsSource = DataAccess.GetData();
- }
- // muista myös muuttaa App.xaml.cs -luokkaa:
- public App()
- {
- this.InitializeComponent();
- this.Suspending += OnSuspending;
- // alustetaan tietokantayhteys
- DataAccess.InitializeDatabase();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement