************************Посмотреть*****************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace MultiThreadTest
{
class Worker
{
private bool _cancelled = false;
public void Cancel()
{
_cancelled = true;
}
public void Work()
{
for (int i = 0; i <= 100; i++)
{
if (_cancelled)
break;
Thread.Sleep(50);
ProgressChanged(i);
}
WorkCompleted(_cancelled);
}
public event Action<int> ProgressChanged;
public event Action<bool> WorkCompleted;
}
}
////////////////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MultiThreadTest
{
public partial class Form1 : Form
{
private Worker _worker;
public Form1()
{
InitializeComponent();
butStart.Click += butStart_Click;
butStop.Click += butStop_Click;
}
private void butStop_Click(object sender, EventArgs e)
{
}
private void butStart_Click(object sender, EventArgs e)
{
_worker = new Worker();
_worker.ProgressChanged += _worker_ProgressChanged;
_worker.WorkCompleted += _worker_WorkCompleted;
butStart.Enabled = false;
_worker.Work();
}
void _worker_WorkCompleted(bool cancelled)
{
string message=cancelled?"Процесс отменен":"Процесс завершен";
MessageBox.Show(message);
butStart.Enabled = true;
}
void _worker_ProgressChanged(int progress)
{
progressBar.Value=progress;
}
}
}
*****************************Invoke*************************
class Worker
{
private bool _cancelled;
public void Cancel()
{
_cancelled = true;
}
public void Work()
{
for (int i = 0; i <= 100; i++)
{
if (_cancelled)
break;
Thread.Sleep(50);
ProgressChanged(i);
}
WorkCompleted(_cancelled);
}
public event Action<int> ProgressChanged;
public event Action<bool> WorkCompleted;
}
/////////////////////////////////////////////////////////
public partial class Form1 : Form
{
private Worker _worker;
public Form1()
{
InitializeComponent();
butStart.Click += butStart_Click;
butStop.Click += butStop_Click;
}
private void butStop_Click(object sender, EventArgs e)
{
if (_worker != null)
{
_worker.Cancel();
}
}
private void butStart_Click(object sender, EventArgs e)
{
_worker = new Worker();
_worker.ProgressChanged += _worker_ProgressChanged;
_worker.WorkCompleted += _worker_WorkCompleted;
butStart.Enabled = false;
Thread thread=new Thread(_worker.Work);
thread.Start();
}
void _worker_WorkCompleted(bool cancelled)
{
Action action = () =>
{
string message = cancelled ? "Процесс отменен" : "Процесс завершен";
MessageBox.Show(message);
butStart.Enabled = true;
};
if (InvokeRequired)
Invoke(action);
else
action();
}
void _worker_ProgressChanged(int progress)
{
Action action = () =>
{
progressBar.Value += 1;
progressBar.Value = progress;
};
if (InvokeRequired)
Invoke(action);
else
action();
}
}
************************Посмотреть*****************************
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace MultiThreadTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
butStart.Click += butStart_Click;
butStop.Click += butStop_Click;
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
string message = e.Cancelled ? "Процесс отменен" : "Процесс завершен";
MessageBox.Show(message);
butStart.Enabled = true;
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage+1;
progressBar.Value = e.ProgressPercentage;
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 99; i++)
{
if (worker.CancellationPending)
{
e.Cancel = true;
break;
}
worker.ReportProgress(i);
Thread.Sleep(50);
}
}
private void butStop_Click(object sender, EventArgs e)
{
worker.CancelAsync();
}
private void butStart_Click(object sender, EventArgs e)
{
butStart.Enabled = false;
worker.RunWorkerAsync();
}
}
}