Arya
Используя ваш подход (асинхронные делегаты), вы не запускаете новый поток, а используете поток из пула потоков .net, который будет освобожден после завершения вашей работы.Правильный способ вызова делегата и его обратного вызова после завершения заключается в следующем:
void button1_Click(object sender, EventArgs e)
{
Class1 c = new Class1();
Action action = c.Test;
action.BeginInvoke(new AsyncCallback(EndTestMethod), null);
}
void EndTestMethod(IAsyncResult token)
{
Action callBack = (Action)((AsyncResult)token).AsyncDelegate;
callBack.EndInvoke(token);
}
Асинхронный подход к делегату полезен, если ваш метод довольно недолговечен и вам требуется обратный вызов.В противном случае, для более длительного процесса вы можете создать и запустить новый поток.
Thread t = new Thread(c.Test);
t.IsBackground = true;
t.Start();
Однако передача обратного вызова вызывающему потоку через обратный вызов станет более длительной, поскольку вам придется самостоятельно писать этот код.
Что касается Диспетчера, этокласс WPF, который ставит в очередь действия, которые должны обрабатываться потоком пользовательского интерфейса в приложениях WPF (среди прочего).Судя по вашему коду, вы пишете приложение Winforms, поэтому этот тип не подходит.
Наконец, для обновления текстового поля необходимо проверить, пытаетесь ли вы получить доступ к этому элементу управления натот же поток, который создал элемент управления (поток пользовательского интерфейса).Это делается через control.invokerequired и control.invoke.Как следует:
void AddText(string text)
{
if (textBox1.InvokeRequired)
{
textBox1.Invoke((Action<string>)AddText, text);
}
textBox1.Text = text;
}