Давайте начнем с кодом:C# ждет задание без блокировки пользовательского интерфейса
private void StartStopService()
{
var task = Task.Run(() => debugService.Iterate());
StartStopInit(true);
//task.Wait();
if (task.IsCompleted)
StartStopInit(false);
}
Я пытаюсь сделать программу, которая будет выполняться список данной DLL файлы из БД по одному, не блокируя поток пользовательского интерфейса в то же время. Предоставляемый метод запускается при нажатии кнопки, и он запускает задачу для перебора DLL.
public void Iterate()
{
foreach (var plugin in runningPlugins)
ExecutePlugin(plugin);
}
Выполнение метода просто выполняет DLL по одному.
Мне нужно решение для запуска метода StartStopInit()
после завершения работы с DLL. Если я поставлю task.Wait()
, я заблокирую UI ... ситуация, поскольку она сейчас, конечно же, не работает, потому что если условие передается при запуске задачи. Если я реализую какой-то бесконечный цикл для прослушивания изменений, я снова заблокирую пользовательский интерфейс. Как я могу решить эту проблему?
Если вы не блокируете пользовательский интерфейс, считаете ли вы, что можете снова запустить операцию, когда она уже выполняется? Я имею в виду, что если 'StartStopService' вызывается на кнопке, считаете ли вы, нужно ли отключать кнопку, пока это происходит? –
Обычный способ теперь в мире async/await - пометить ваш метод как 'async Task' (вместо' void') и использовать 'await task;', чтобы дождаться завершения задачи. Обратите внимание на мой предыдущий комментарий о не блокировании пользовательского интерфейса. –
Ну, идея конца заключается в том, чтобы направить маркер отмены на кнопку, если задача все еще выполняется – Norgul