异步编写新代码但调用同步
Writing new code in async but calling sync
我正在编写一些新代码并希望使用 async 和 await 来编写它,但是调用代码目前不是用 async 编写的。在调用代码支持异步之前,在异步中编写新代码并调用它是否正确?
或者我应该写代码同步然后在以后转换它?它会被视为技术债务吗?
public Result Execute( Paramerters parameters ) {
return ExecuteAsync( parameters ).Result;
}
public Task<Result> ExecuteAsync( Paramerters parameters ) {
...
}
Execute
在一个接口上,并从其他一些尚未异步的代码中调用。创建异步版本并从 Execute
调用它直到调用 Execute
的代码转换为异步是否正确?
我的旧代码是用 .net 4.5.1 编写的,但尚未转换为异步。
http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638.aspx 关于为什么要避免这种情况,以及如果不能避免如何缓解这个问题,有一些很好的观点。
然而,
Or should I write the code sync and then convert it at a later date?
这可能更容易,并且确实完全摆脱了这个问题。
And would it be considered technical debt?
根据定义,它是:
你可能需要在未来进行同步调用,以支持这种情况,所以你已经有了技术债务,你只是在处理它。
您确实已经有技术债了。你说,"but the calling code is not currently written in async"。好了,那是你的债,已经存在了。
如果同步版本和异步版本相互镜像(很常见)并且您将这些方法放在它们的双胞胎旁边,那么可以很容易地同时对每个版本进行大部分更改。
根据 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 else 方法 return 某些东西以便它移动到下一个参数。如果您要同步执行此操作,则执行将不得不等待并且总执行时间可能会更慢。
如果被调用的方法执行其他异步方法,那么同步调用 anyc 方法可能会有一些好处。
我有一篇关于 brownfield async
development 主题的 MSDN 文章——即将 async
引入同步代码库。有几种不同的方法,每种方法各有利弊。我的偏好是使用 flag 参数 hack,例如:
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 就是技术债务。
我正在编写一些新代码并希望使用 async 和 await 来编写它,但是调用代码目前不是用 async 编写的。在调用代码支持异步之前,在异步中编写新代码并调用它是否正确?
或者我应该写代码同步然后在以后转换它?它会被视为技术债务吗?
public Result Execute( Paramerters parameters ) {
return ExecuteAsync( parameters ).Result;
}
public Task<Result> ExecuteAsync( Paramerters parameters ) {
...
}
Execute
在一个接口上,并从其他一些尚未异步的代码中调用。创建异步版本并从 Execute
调用它直到调用 Execute
的代码转换为异步是否正确?
我的旧代码是用 .net 4.5.1 编写的,但尚未转换为异步。
http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638.aspx 关于为什么要避免这种情况,以及如果不能避免如何缓解这个问题,有一些很好的观点。
然而,
Or should I write the code sync and then convert it at a later date?
这可能更容易,并且确实完全摆脱了这个问题。
And would it be considered technical debt?
根据定义,它是:
你可能需要在未来进行同步调用,以支持这种情况,所以你已经有了技术债务,你只是在处理它。
您确实已经有技术债了。你说,"but the calling code is not currently written in async"。好了,那是你的债,已经存在了。
如果同步版本和异步版本相互镜像(很常见)并且您将这些方法放在它们的双胞胎旁边,那么可以很容易地同时对每个版本进行大部分更改。
根据 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 else 方法 return 某些东西以便它移动到下一个参数。如果您要同步执行此操作,则执行将不得不等待并且总执行时间可能会更慢。
如果被调用的方法执行其他异步方法,那么同步调用 anyc 方法可能会有一些好处。
我有一篇关于 brownfield async
development 主题的 MSDN 文章——即将 async
引入同步代码库。有几种不同的方法,每种方法各有利弊。我的偏好是使用 flag 参数 hack,例如:
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 就是技术债务。