Разница В Выполнении Async/Await

Я пытаюсь получить хорошее представление о async / await, и я хочу очистить некоторую путаницу. Может кто-то пожалуйста, объясните, в чем будет разница с точки зрения выполнения следующие:

// version 1
public Task Copy(string source, string destination) {
    return Task.Run(() => File.Copy(source, destination));
}

public async Task Test() {
    await Copy("test", "test2");    
    // do other stuff
}

и:

// version 2
public async Task Copy(string source, string destination) {
    await Task.Run(() => File.Copy(source, destination));
}

public async Task Test() {
    await Copy("test", "test2");
    // ...
}

они приводят к одному и тому же коду и почему я должен писать один поверх другого ?

1 ответов


во-первых, позвольте мне начать с того, что оба кода не же.

ваш код version1 создаст только одну "государственную машину", поскольку он содержит await в Test метод только.

ваш код version2 создаст две "государственные машины" для Copy и Test метод, который добавляет некоторые накладные расходы.

почему мы используем async методами? Просто просто сделать наш код читаемым, элегантным при работе с"асинхронными задачами". Это делает наш код лучше избегать обратных вызовов и продолжений и т. д.

давайте сломаем что Copy метод делает и мы отвечаем вопрос, действительно ли нам это нужно async?

Copy метод просто делегирует вызов Task.Run, который возвращает задачу, которая в конечном итоге достигает завершения на 'ы. Таким образом, намерение ясно, здесь нам нужна задача, которая уведомляет File.Copy завершение. Этот метод делает все, что вам нужно, не нужно быть async работать, как ожидалось.

Итак, когда вам нужен async?

вам нужна асинхронность, когда вам нужно выполнить некоторый код по завершении предыдущей задачи (продолжение).

пример:

public async Task Test() 
{
    await Copy("test", "test2");
    DoPostCopied(whatever);
    await DoPostCopied2();//Etc
}

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

Вывод:async только когда требуются. В этом случае version1 лучше, и вы должны предпочесть его version2.