вот набрасал быстро
на форме две кнопки и textbox (первая стартует процесс, вторая cancel-ит). Больше ниче делать не надо (разве что имя файла поменять) 8-)
Для удобства работа вынесена в отдельный класс.
Код | public Form1() { InitializeComponent(); button2.Enabled = false; button1.Click += button1_Click; button2.Click += button2_Click; }
TxtSlowReader _txtReader;
private void button1_Click(object sender, EventArgs e) { _txtReader = new TxtSlowReader("C:\\textfile.txt"); _txtReader.OnComplete += txtReader_OnComplete; _txtReader.WorkAsync(); button1.Enabled = false; button2.Enabled = true; }
void txtReader_OnComplete(object sender, TxtSlowReaderEventArgs e) { button1.Enabled = true; button2.Enabled = false;
if (e.Error != null) MessageBox.Show(e.Error.ToString(), "ERROR!"); else if(e.Lines==null) MessageBox.Show("Canceled!", "ok"); else if (e.Lines != null) textBox1.Text = string.Join(", ", e.Lines); }
private void button2_Click(object sender, EventArgs e) { if (null != _txtReader) { _txtReader.Abort(); _txtReader = null; } } }
public class TxtSlowReaderEventArgs : EventArgs { public TxtSlowReaderEventArgs(Exception error, IList<string> lines) { this.Error = Error; this.Lines = lines; }
public Exception Error { get; private set; } public IList<string> Lines { get; private set; } }
public class TxtSlowReader { private string _filename; private BackgroundWorker _bw; public TxtSlowReader(string filename) { _filename = filename; }
public void Abort() { lock (this) { if (_bw != null) { _bw.CancelAsync(); _bw = null; } } }
public void WorkAsync() { _bw = new BackgroundWorker(); _bw.WorkerSupportsCancellation = true; _bw.DoWork += bw_DoWork; _bw.RunWorkerCompleted += bw_RunWorkerCompleted; _bw.RunWorkerAsync(); }
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (null != OnComplete) { if (e.Cancelled) OnComplete(this, new TxtSlowReaderEventArgs(null, null)); else OnComplete(this, new TxtSlowReaderEventArgs(e.Error, (IList<string>)e.Result)); } }
void bw_DoWork(object sender, DoWorkEventArgs e) { List<string> rv = new List<string>(); using (var fs = new FileStream(_filename, FileMode.Open, FileAccess.Read)) { using (var txtr = new StreamReader(fs)) { string line; while ((line = txtr.ReadLine()) != null) { lock (this) { if (_bw == null || _bw.CancellationPending) { rv = null; break; } }
Thread.Sleep(200); rv.Add(line); } } } e.Result = rv; }
public event EventHandler<TxtSlowReaderEventArgs> OnComplete; }
|
|