Работа с TPL с использованием встроенных задач - PullRequest
0 голосов
/ 08 марта 2012

Я запускаю процесс в отдельном потоке, чтобы облегчить параллелизм и плавный пользовательский интерфейс, вызывая

private void ThreadedTestConnection(SqlConnection conn, bool bShowErrMsg)
{
    Task<bool> asyncTestConn = Task.Factory.StartNew<bool> 
        (() => TestConnection(conn, bShowErrMsg)); 
    return asyncTestConn.Result;
    asyncTestConn.Dispose();
}

из потока пользовательского интерфейса.Однако «ожидание», вызванное return asyncTestConn, останавливает поток UI, возвращаемый обратно в GUI.Я придумал следующее исправление.От события, запущенного из моего графического интерфейса (не включая try / catch блоки)

private void SomeClick_Event(object sender, EventArgs e)
{
    Task testConnection = Task.Factory.StartNew
        (() => UtilsDB.ThreadedTestConnection(mainConn, true));
}

Это работает.Таким образом, он сразу возвращает управление графическому интерфейсу во время выполнения теста в отдельном фоновом потоке.Я очень глупый мальчик в этом, или это хорошо?

Примечание: Это отдельный вопрос, но связанный с этим Я не получил удовлетворительного ответа.

1 Ответ

1 голос
/ 08 марта 2012

Это прекрасно, вы только запускаете задачу «запусти и забудь», которая будет выполняться в потоке пула потоков - однако в первом примере вы, похоже, ожидаете результата (я предполагаю логическое значение, указывающее, проверяет ли соединение был успешным) - во втором у вас не будет ни одного - если ваша задача, например, Вызывает событие или вызывает предопределенный обратный вызов.

...