Как выполнять task в отдельном потоке?

235
03 мая 2018, 06:40

Есть метод, который читает журнал событий:

public List<LogPage> Read()
    {
        Task<List<LogPage>> task = Task.Factory.StartNew(() =>
        {
            //здесь читаем
        });
        task.Wait();
        return task.Result;
    }

Вот так я его запускаю:

void LoadJournal_Execute(object paramete)
    {
        Log log = new Log();
        var events = log.Read();
    }

Как выполнять эту задачу в отдельном потоке? Чтобы GUI не зависало? Версия .Net - 4.0

Answer 1

Вы и так выполняете работу в другом потоке, просто вот тут

    task.Wait();
    return task.Result;

вы заставляете текущий поток ждать конца выполнения. Чтобы сделать задачу асинхронной, вам не надо ждать окончания таска. Как пример

public Task<List<LogPage>> ReadAsync()
{
    return Task.Run(() =>
    {
            //здесь читаем
    }); 
}

и вызов

async void LoadJournal_Execute(object paramete)
{
    Log log = new Log();
    var events = await log.ReadAsync();
}

Но имейте ввиду, что код, который вызывает LoadJournal_Execute не узнает, когда метод завершит работу. Если надо, чтобы вызывающий код знал, когда работа завершится, то LoadJournal_Execute также должен вернуть таск.

async Task LoadJournal_Execute(object paramete)
{
    Log log = new Log();
    var events = await log.ReadAsync();
}
READ ALSO
Собрать универсальное C# приложение

Собрать универсальное C# приложение

Недавно сделал для себя открытие - при сборкеNET-приложения я могу выбрать разрядность целевой платформы

215
C# Ошибка в decrypt

C# Ошибка в decrypt

Как справиться с ошибкой

228
Wordpress не удается подключить стили

Wordpress не удается подключить стили

Все перепроверил несколько разНе знаю где ошибка

232
Как сделать равноудаленные inline блоки?

Как сделать равноудаленные inline блоки?

БЕЗ ФЛЕКСБОКСА И ГРИДОВ, нужна бОльшая поддержка браузеров

275