server = new ServerObject();
server.SendMessage += Cl_SendMessage;
listenerThread = new Thread(new ThreadStart(server.Listen));
listenerThread.Start(); // старт потока
// Прослушивание входящих подключений
protected internal void Listen()
{
try
{
listener = new TcpListener(IPAddress.Any, 8888);
listener.Start(); // запуск прослушивания входящих запросов
while (true)
{
TcpClient tcpClient = listener.AcceptTcpClient(); // принимаем ожидающий запрос на подключение
ClientObject clientObject = new ClientObject(tcpClient, this);
clientObject.SendMessage += this.SendMessage;
Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
clientThread.Start(); // старт потока
}
}
catch (Exception exc)
{
Disconnect();
}
}
https://msdn.microsoft.com/magazine/gg598924.aspx
Четкого определения истинного «контекста» SynchronizationContext нет. В разных инфраструктурах и хостах могут быть определены свои контексты.
WindowsFormsSynchronizationContext (System.Windows.Forms.dll: System.Windows.Forms) Приложения Windows Forms будут создавать и устанавливать WindowsFormsSynchronizationContext в качестве текущего контекста для любого потока, который создает UI-элементы. Этот SynchronizationContext использует методы ISynchronizeInvoke применительно к UI-элементу, который передает делегаты нижележащему Win32-циклу обработки сообщений. Контекст для WindowsFormsSynchronizationContext — единственный UI-поток.
Все делегаты, которые ставятся в очередь к WindowsFormsSynchronizationContext, выполняются по одному конкретным UI-потоком в том порядке, в каком они были поставлены в очередь. Текущая реализация создает один WindowsFormsSynchronizationContext для каждого UI-потока.
AspNetSynchronizationContext (System.Web.dll: System.Web [внутренний класс]) SynchronizationContext в ASP.NET устанавливается в потоках из пула, когда они выполняют код страницы. Делегат, помещаемый в очередь полученного AspNetSynchronizationContext, восстанавливает идентификацию и культуру исходной страницы, а затем напрямую выполняет делегат. Этот делегат вызывается напрямую, даже если он ставится в очередь «асинхронно» вызовом Post.
С концептуальной точки зрения, контекст AspNetSynchronizationContext весьма сложен. В течение срока жизни асинхронной страницы контекст начинает всего с одним потоком из пула потоков ASP.NET. После выдачи асинхронных запросов контекст не включает никаких потоков. По мере завершения асинхронных запросов потоки из пула, выполняющие свои процедуры завершения, входят в контекст. Это могут быть те же потоки, которые инициировали запросы, но с большей вероятностью они представляют собой свободные потоки, которые были на момент завершения операций.
// получаем элемент из ячейки
var control = tableLayoutPanel.GetControlFromPosition(0, 0);
// удаляем, т.к. больше одного элемента нельзя размещать
tableLayoutPanel.Controls.Remove(control);
// добавляем новый элемент в ячейку
tableLayoutPanel.Controls.Add(new Label { Text = "это новый элемент" }, 0, 0);
// индексация с нуля
// 0 - первая колонка, 0 - первая строка
var control = tableLayoutPanel.GetControlFromPosition(0, 0);
var tableLayoutPanel = new TableLayoutPanel();
tableLayoutPanel.ColumnCount = 3;
tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F));
tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 70F));
tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F));
tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
tableLayoutPanel.Location = new System.Drawing.Point(0, 0);
tableLayoutPanel.RowCount = 3;
tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
tableLayoutPanel.Visible = true;
var rnd = new Random(DateTime.Now.Millisecond);
for (int col = 0; col < tableLayoutPanel.ColumnCount; col++)
{
for (int row = 0; row < tableLayoutPanel.RowCount; row++)
{
var panel = new Panel();
panel.BackColor = Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255));
panel.Dock = DockStyle.Fill;
tableLayoutPanel.Controls.Add(panel, col, row);
}
}
this.Controls.Add(tableLayoutPanel);<ph index="1"></ph>
Добавил правильный пример в свой ответ.