Shamil Salakhetdinov
shamil at smsconsulting.spb.ru
Tue Jan 26 09:59:29 CST 2010
Hi John --
Here is a promised WinForms sample code with .InvokeRequired and .Invoke
(Part 1):
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace WindowsFormsApp
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new TestForm());
}
}
// TestForm Designer
partial class TestForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be
disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.cmdTest = new System.Windows.Forms.Button();
this.txtTest = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// cmdTest
//
this.cmdTest.Location = new System.Drawing.Point(128, 205);
this.cmdTest.Name = "cmdTest";
this.cmdTest.Size = new System.Drawing.Size(75, 23);
this.cmdTest.TabIndex = 0;
this.cmdTest.Text = "&Test";
this.cmdTest.UseVisualStyleBackColor = true;
this.cmdTest.Click += new
System.EventHandler(this.cmdTest_Click);
//
// txtTest
//
this.txtTest.Location = new System.Drawing.Point(12, 13);
this.txtTest.Multiline = true;
this.txtTest.Name = "txtTest";
this.txtTest.Size = new System.Drawing.Size(311, 175);
this.txtTest.TabIndex = 1;
//
// TestForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(335, 240);
this.Controls.Add(this.txtTest);
this.Controls.Add(this.cmdTest);
this.Name = "TestForm";
this.StartPosition =
System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Test Form";
this.Load += new System.EventHandler(this.TestForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button cmdTest;
private System.Windows.Forms.TextBox txtTest;
}
// TestForm Code Behind
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
}
private My.BusinessLayerClassLib.SpRunnerManager _runner;
private void TestForm_Load(object sender, EventArgs e)
{
_runner = new My.BusinessLayerClassLib.SpRunnerManager();
_runner.StatusReport +=
new
EventHandler<My.CoreClassLib.SpRunnerStatusReportEventArgs>(statusReport);
}
private void cmdTest_Click(object sender, EventArgs e)
{
txtTest.Text = null;
_runner.Run();
}
private void statusReport(object sender,
My.CoreClassLib.SpRunnerStatusReportEventArgs e)
{
string message =
string.Format("{0}: Processing {1} of {2}...",
sender.GetType(), e.CurrentCount, e.MaxCount);
if (txtTest.InvokeRequired)
{
object[] args = { message };
this.Invoke(new logDelegate(log), args);
}
else log(message);
}
private delegate void logDelegate(string message);
private void log(string message)
{
txtTest.Text = message + System.Environment.NewLine +
txtTest.Text;
}
}
}
...Continued in part 2....