I have just found a better solution for this problem using
AsyncOperationManager class. A code sample is below.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Counter myCounter = new Counter(1000);
myCounter.IndexValueChanged += myCounter_IndexValueChanged;
myCounter.StartCountAsync();
}
void myCounter_IndexValueChanged(object sender, IndexValueChangedEventArgs e)
{
textBox1.Text = e.Index.ToString();
}
}
class Counter
{
public delegate void IndexValueChangedEventHandler(object sender, IndexValueChangedEventArgs e);
public event IndexValueChangedEventHandler IndexValueChanged;
int _maxNumber;
int _index;
public Counter(int maxNumber)
{
_maxNumber = maxNumber;
}
public async void StartCountAsync()
{
AsyncOperation asyncCountOperation = AsyncOperationManager.CreateOperation(null);
await Task.Run(() =>
{
for (int i = 0; i < _maxNumber; i++)
{
_index = i;
asyncCountOperation.Post(new SendOrPostCallback(delegate
{
if (IndexValueChanged != null)
IndexValueChanged(this,
new IndexValueChangedEventArgs(_index));
}), null);
}
});
}
}
class IndexValueChangedEventArgs
{
int indexNum;
public IndexValueChangedEventArgs(int index)
{
indexNum = index;
}
public int Index
{
get { return indexNum; }
}
}