2016-03-04 2 views
3

Я пишу какой-то новый код и хотел бы написать его с помощью async и ждать, но код вызова в настоящее время не написан в async. Правильно ли писать новый код в async и вызывать его синхронизацию, пока вызывающий код не поддерживает async?Написание нового кода в async, но вызов синхронизации

Или мне нужно написать код синхронизации, а затем преобразовать его позже? И это будет считаться техническим долгом?

public Result Execute(Paramerters parameters) { 
    return ExecuteAsync(parameters).Result; 
} 

public Task<Result> ExecuteAsync(Paramerters parameters) { 
    ... 
} 

Execute на интерфейс и вызывается из какого-либо другого кода, который еще не асинхронный. Правильно ли создавать асинхронную версию и вызывать ее с Execute, пока код, вызывающий Execute, не преобразуется в async? Мой старый код написан в .net 4.5.1, но еще не преобразован в async.

+4

Я очень рекомендую придерживаться мантры «async all the down» и обновлять код сразу же. Это хорошее чтение по теме: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html Также имейте в виду, что «мы исправим оставшуюся часть позже» «подход, возможно, является самым распространенным заблуждением во всей отрасли разработки программного обеспечения. Не переполняйте вещи. Либо сделайте код асинхронным, либо нет. – David

+5

Это называется «sync over async» и является анти-шаблоном. Это * обычно * очень плохая идея, и некоторые комбинации sync-over-async или async-over-sync могут * полностью затормозить * ... –

ответ

3

http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638.aspx имеет некоторые хорошие моменты как для того, чтобы избежать этого, так и для решения проблемы, если вы не можете.

Однако

Или я должен написать код синхронизации, а затем преобразовать его в более поздний срок?

Это, скорее всего, будет проще, и он полностью уйдет от проблемы.

И это будет считаться техническим долгом?

По определению это, хотя:

  1. Вам может понадобиться иметь синхронные вызовы в будущем в любом случае, чтобы поддержать это дело, так что у вас уже есть, что технический долг, вы просто имея дело с этим.

  2. У вас есть do есть этот технический долг. Вы сказали, «но код вызова в настоящее время не написан в async». Вот, это ваш долг, уже там.

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

0

В зависимости от того, что делает ExecuteAsync, это имеет существенное значение.

Пусть ExecuteAsync сделал следующее:

public Task<Result> ExecuteAsync(Paramerters parameters) { 
    List<Task> tasks = new List<Task>(); 
    foreach(var param in parameters) 
    { 
     var task = ExecuteSomethingElseAsync(param); 
     tasks.Add(task); 
    } 
    Task.WhenAll(tasks.ToArray()); 
} 

Предполагая ExecutingSomethingelse был IO интенсивной другие задачи будут выполняться без необходимости в ожидании ExecuteSomething еще метод, чтобы вернуть что-то для того, чтобы перейти на следующий парам. Если бы вы сделали это синхронно, выполнение должно было бы подождать, и общее время выполнения может быть медленнее.

Вызов метода anyc синхронно может содержать некоторые преимущества, если вызываемый метод выполняет другие методы async.

+0

Мой код выполняет вызовы базы данных –

2

У меня есть статья MSDN по теме brownfield async development - то есть, вводя async в синхронную кодовую базу.Существует несколько разных подходов, каждый из которых имеет свои плюсы и минусы. Я предпочитаю использовать флаг аргумент хак, как таковые:

public Result Execute(Parameters parameters) 
{ 
    return ExecuteCoreAsync(parameters, sync: true).GetAwaiter().GetResult(); 
} 

public Task<Result> ExecuteAsync(Parameters parameters) 
{ 
    return ExecuteCoreAsync(parameters, sync: false); 
} 

private async Task<Result> ExecuteCoreAsync(Parameters parameters, bool sync) 
{ 
    if (sync) 
    { 
    Thread.Sleep(2000); // sync implementation 
    return new Result(); 
    } 
    else 
    { 
    await Task.Delay(2000); // async implementation 
    return new Result(); 
    } 
} 

И да, если основная работа, естественно, асинхронная, то синхронный API является техническим долгом.

Смежные вопросы