Служба WCF: вызов первой функции, возврат из нее, а затем вызов второй функции для работы в фоновом режиме. - PullRequest
0 голосов
/ 09 мая 2018

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

Я хочу сделать следующее:

public bool myMainFunction(){

    bool result = updateTable1();

    return result;

    updateTable2();

}

Как мне этого добиться?

Спасибо

1 Ответ

0 голосов
/ 09 мая 2018

Попробуйте это

using System.Threading.Tasks;

public bool MyMainFunction()
{
    bool result = UpdateTable1();

    Task.Run(() => UpdateTable2());

    return result;    
}

Task.Run (Действие)
От: https://msdn.microsoft.com/en-us/library/hh195051(v=vs.110).aspx

ставит в очередь указанную работу для запуска в пуле потоков и возвращает объект Task, представляющий эту работу.

По сути, Task.Run помещает ваш элемент в пул потоков - что позволяет ему работать асинхронно. Обычно вы связываете это с методами задачи Wait или Result , чтобы заблокировать вызывающий поток до завершения задачи, например:

using System.Threading.Tasks;

public bool MyMainFunction()
{
    Task<bool> task = Task.Run(() => UpdateTable1());

    Task.Run(() => UpdateTable2());

    return task.Result;
}

В предыдущем примере - оба метода теперь поставлены в очередь в пуле потоков - это означает, что они могут выполняться параллельно. (В первом примере - UpdateTable1 должен был завершиться до начала UpdateTable2 - но мы запустили и забыли об UpdateTable2 - так что это было несущественно). Новый пример теперь позволяет UpdateTable2 начать выполнение до завершения UpdateTable1. Однако теперь у нас возникнет проблема, поскольку нам нужно дождаться, пока результат UpdateTable1 вернет требуемое значение bool.

Когда вы вызываете, task.Wait () или task.Result , ваш метод в основном приостанавливается до завершения задачи - в этом случае он ждет, пока table1 не обновится .

Теперь - вы заметите, что у нас нет переменной для хранения состояния задач UpdateTable2 - это потому, что вам плевать на результат. Поскольку не хранится ни одна переменная, мы никогда не блокируем вызывающий поток для просмотра результата - это означает, что вы фактически получили метод «Fire and Forget».

Надеюсь, это поможет немного прояснить ситуацию - но если нет, есть множество ресурсов, чтобы помочь, посмотрите на Асинхронное и Параллельное программирование, так как найдутся люди, которые могут объяснить более ясно, чем я.

Мне было полезно следующее:
MCSD сертификация-инструментарий-экзамен-70-483

Я также преобразовал имена ваших методов из Case Camel в Pascal Case, поскольку это стандартная практика.

...