Alka ha scritto:
Comunque siamo abbondantemente OT.
Giusto.
@Pivello
per ritornare in tema, un codice semplice, per saggiare come usare backgroundworker.
Il codice sembra lungo perché ho inizializzato tutti gli strumenti da codice, le righe interessanti per far funzionare backgroundworker sono veramente poche e segnalate con: ti interessa, il resto è contorno:
using System;
using System.Collections.Generic;
using System.ComponentModel; // contiene BackgroundWorker, ti interessa
using System.Linq;
using System.IO;
using System.Diagnostics;
using System.Windows.Forms;
/**********************************************
* CARICA UN FILE IN MODO ASINCRONO *
* MOSTRA RIGA RIGA ATTRAVERSO UNA SCROLLBAR *
* CODICE WINFORM NULLA DA AGGIUNGERE SUL FORM *
* ********************************************/
namespace TestiGrandi // in Program.cs il namesapace deve corrispondere
{
public partial class Form1 : Form
{
private List<string> TESTOletto = new List<string>();
private string Cx = "|/-\\";
private byte n = 0;
private Stopwatch StWa = new Stopwatch();
// inseribili anche da progettazione ------------------------
private OpenFileDialog openFile = new OpenFileDialog();
private Timer timer1 = new Timer();
private BackgroundWorker Worker = new BackgroundWorker(); // Worker lavorerà in asincrono, ti interessa
private RichTextBox richTextBox1 = new RichTextBox();
private HScrollBar hScrollBar1 = new HScrollBar();
private Button Button1 = new Button();
private Label Label1 = new Label();
// ----------------------------------------------------------
public Form1()
{
InitializeComponent();
// inseribili anche da progettazione -------------------
Controls.Add(richTextBox1);
Controls.Add(hScrollBar1);
Controls.Add(Button1);
Controls.Add(Label1);
hScrollBar1.Scroll += HScrollBar1_Scroll;
Button1.Click += Button1_Click;
timer1.Tick += Timer1_Tick;
Worker.DoWork += Worker_DoWork; // attiva l'evento DoWork, ti interessa
Worker.RunWorkerCompleted += Worker_RunWorkerCompleted; // attiva l'evento RunWorkerCompleted, ti interessa
// ----------------------------------------------------
// impostabili anche da progettazione -----------------
richTextBox1.Location = new System.Drawing.Point(12, 84);
richTextBox1.Size = new System.Drawing.Size(ClientSize.Width - 24, ClientSize.Height - 100);
richTextBox1.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
Button1.Location = new System.Drawing.Point(12, 14);
Button1.Text = "LOAD";
Label1.Location = new System.Drawing.Point(94, 19);
Label1.AutoSize = false;
Label1.Size = new System.Drawing.Size(40, 15);
Label1.BackColor = System.Drawing.Color.Green;
Label1.Visible = false;
hScrollBar1.Location = new System.Drawing.Point(12, 52);
hScrollBar1.Width = ClientSize.Width - 24;
hScrollBar1.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
hScrollBar1.LargeChange = 1;
timer1.Interval = 100;
// ----------------------------------------------------
}
private void Button1_Click(object sender, EventArgs e)
{
LeggiFileTxt();
}
private void LeggiFileTxt()
{
openFile.Filter = "File di testo (*.txt)|*.txt|Tutti i file (*.*)|*.*";
openFile.RestoreDirectory = true;
if (openFile.ShowDialog() == DialogResult.OK) // modo corretto di impostare la dialog, per gestire anche annulla
{
string PercorsoDelFile = openFile.FileName;
StWa.Reset(); // azzera il tempo
StWa.Start();
if (Worker.IsBusy)// si esce se il vecchio processo non è terminato, ti interessa
{
return;
}
Worker.RunWorkerAsync(PercorsoDelFile); // richiama Worker_DoWork e passa il percorso, ti interessa
timer1.Enabled = true; // visualizza il tempo
// mentre Worker carica il testo in modo asincrono
// il programma non è bloccato, e può eseguire altre operazioni
// l'evento Worker_RunWorkerCompleted si attiva quando il compito
// di caricamento è terminato, e lì ci sarà il codice che serve per
// notificare al resto del programma che il testo è disponibile
}
}
private void Worker_DoWork(object sender, DoWorkEventArgs e) // ti interessa
{
// in e.Result si può restituire qualsiasi oggetto, io restituisco un testo
// in e.Argument c'è l'argomento passato da: Worker.RunWorkerAsync(PercorsoDelFile); eseguo la conversione di tipo con (string)
TESTOletto = File.ReadAllLines((string)e.Argument, System.Text.Encoding.UTF8).ToList(); // legge il file dal percorso in e.Argument, ti interessa
e.Result = "Lette n. " + TESTOletto.Count.ToString("#,#") + " righe da: " + (string)e.Argument; // restituisco una stringa leggibile in Worker_RunWorkerCompleted, ti interessa
}
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) // ti interessa
{
timer1.Enabled = false; // file caricato
richTextBox1.Text = (string)e.Result; // mostro cosa ha restituito Worker in Result, eseguo la conversione di tipo con (string)
hScrollBar1.Maximum = TESTOletto.Count - 1;
hScrollBar1.Minimum = 0;
Label1.Visible = false;
}
private void Timer1_Tick(object sender, EventArgs e)
{
// esecuzione mentre Worker lavora in background, ma si potrebbe fare anche altro
richTextBox1.Text = "Lettura da file in corso " + StWa.ElapsedMilliseconds + " ms. " + Cx[n];
if (n > 2) n = 0; else n++;
Label1.Visible = !Label1.Visible;
}
private void HScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
// se muovi la scrollbar, visualizzo una riga del testo caricato
richTextBox1.Text = TESTOletto[hScrollBar1.Value];
}
}
}