Запуск формы Windows в отдельном потоке - PullRequest
1 голос
/ 21 октября 2010

Я имею дело с управлением элементом в форме, однако сама форма не имеет для меня значения.По сути, я хочу, чтобы форма выполняла задачу и возвращала значение, однако для этого я хотел бы использовать что-то вроде AutoResetEvent для возврата из вызова функции только после ее завершения, что, очевидно, блокировало бы поток форм и делало это невозможным.для выполнения задачи.

Ответы [ 4 ]

9 голосов
/ 22 октября 2010

Я сделал это один раз для моего проекта

var frmNewForm = new Form1();
var newThread = new System.Threading.Thread(frmNewFormThread);

newThread.SetApartmentState(System.Threading.ApartmentState.STA);
newThread.Start();

И добавьте следующий метод. Ваш newThread.Start будет вызывать этот метод.

public void frmNewFormThread()
{
    Application.Run(frmNewForm);
}
2 голосов
/ 21 октября 2010

У меня на уме две идеи:

  1. Запуск метода делегата

    IAsyncResult ar = del.BeginInvoke(callback, state);

    ... выполнить задание

    EndInvoke(ar); // ожидание результата задачи, если вы разрешите ждать

  2. Отдельная нить

Лучшим способом может быть использование отдельного потока для выполнения задачи и вызов делегата в этом потоке, чтобы сообщить основному потоку о завершении работы.

edit: или Worker, как предложить мой предшественник

2 голосов
/ 22 октября 2010

Я думаю, что самое простое решение - просто вызвать событие из формы, как только задача будет выполнена.

void RunTask()
{
    Form form = new Form();
    form.TaskCompleted += new EventHandler(form_TaskCompleted);
    form.Show();
}

void form_TaskCompleted(object sender, EventArgs e)
{
    object result = ((Form)sender).GetResult();
}

Редактировать: Конечно, вы захотите удалить форму и отцепить это событие, как только оно будет выполнено.завершено и т.д ..

2 голосов
/ 21 октября 2010

Почему вы запускаете задачи в форме?

Похоже, у вас плотно интегрированы интерфейс и логика программы.Это плохой дизайн.

В общем, вы можете получать данные из рабочего потока стандартным способом.Работник сохраняет данные в поточно-безопасной структуре данных, а затем отправляет событие в главный поток, сообщая, что данные доступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...