Skip to content

Instantly share code, notes, and snippets.

@GeorgeTsiokos
Created January 4, 2019 18:26
Show Gist options
  • Save GeorgeTsiokos/52f141b7d851329acbd4a15947c1d3eb to your computer and use it in GitHub Desktop.
Save GeorgeTsiokos/52f141b7d851329acbd4a15947c1d3eb to your computer and use it in GitHub Desktop.
UpdateDataGridFromBackgroundThread
public static class DataThread
{
public static Action<DataTable> UpdateDelegate { get; set; }
public static void Execute(TimeSpan updateRate, TimeSpan sleepRate)
{
var key = int.MinValue;
var dataTable = CreateDataTable();
var columns = dataTable.Columns;
var rows = dataTable.Rows;
var random = new Random();
var stopwatch = Stopwatch.StartNew();
while (true)
{
do
{
// add
if (rows.Count < 10)
{
var rowValues = Enumerable.Range(0, columns.Count - 1).Select(c => (object) random.Next(0, 500))
.ToArray();
rows.Add(new object[] {key++}.Concat(rowValues).ToArray());
}
// remove
if (rows.Count > 0 && random.Next(0, 99) < 5)
{
var rowIndex = random.Next(0, rows.Count);
rows.RemoveAt(rowIndex);
}
// update
if (rows.Count > 0)
for (var i = 0; i < 10; i++)
{
var columnIndex = random.Next(1, columns.Count);
var rowIndex = random.Next(0, rows.Count);
rows[rowIndex][columnIndex] = i;
}
Thread.Sleep(sleepRate);
} while (stopwatch.Elapsed < updateRate);
var changes = dataTable.GetChanges();
UpdateDelegate(changes);
dataTable.AcceptChanges();
stopwatch.Reset();
stopwatch.Start();
}
}
public static DataTable CreateDataTable()
{
var dataTable = new DataTable();
var key = dataTable.Columns.Add("Key", typeof(int));
dataTable.PrimaryKey = new[] {key};
for (var c = 'A'; c <= 'G'; c++)
{
dataTable.Columns.Add(c.ToString(), typeof(int));
}
dataTable.AcceptChanges();
return dataTable;
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
_dataGridView.DoubleBuffered(true);
}
public DataTable DataTable
{
get => _dataGridView.DataSource as DataTable;
set
{
_dataGridView.DataSource = value;
_dataGridView.Columns[0].Visible = false;
}
}
}
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var uiDataTable = DataThread.CreateDataTable();
var mainForm = new Form1 {DataTable = uiDataTable};
void UiDelegate(DataTable uiChanges) => uiDataTable.Merge(uiChanges);
DataThread.UpdateDelegate = changes => mainForm.Invoke((Action<DataTable>) UiDelegate, changes);
var dataThread = new Thread(_ => DataThread.Execute(TimeSpan.FromMilliseconds(300), TimeSpan.FromMilliseconds(50)));
mainForm.Load += (sender, args) => dataThread.Start();
mainForm.Closed += (sender, args) => dataThread.Abort();
Application.Run(mainForm);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment