将带有 Action/Func 参数的同步方法转换为异步方法

尴尬的程序员

我环顾四周,在任何地方都找不到这个问题。

鉴于以下方法:

public TOut WithThing<TOut>(Func<T, TOut> func)
{
  var thing = CreateThing();
  thing.DoSomething();
  return func(thing);
}

void当我不想返回值时,我有一个等效的方法来包装上面的内容(它实际上是在调用WithThing<bool>并且只是丢弃结果):

public void WithThing(Action<T> action)
{
  WithThing(x =>
  {
    action(x);
    return false;
  });
}

我正在尝试创建上述方法的异步版本,因为“事物”具有同步和异步方法。

认为第一种方法的等价物是:

public async Task<TOut> WithThing<TOut>(Func<T, Task<TOut>> func)
{
  var thing = CreateThing();
  await thing.DoSomethingAsync().ConfigureAwait(false);
  return await func(thing).ConfigureAwait(false);
}

我不认为我需要ConfigureAwait's 但 Visual Studio 建议他们。这样对吗?为什么我需要ConfigureAwait的?

如果上面的代码是正确的,那么我猜不返回值的等价物的签名将是public async Task WithThing(Func<T, Task> func). 身体会是什么?

保罗·莫尔加多

请注意,使用ConfigureAwait(false)是上下文相关的,您必须知道何时不使用它。请参阅ConfigureAwait FAQAsync/Await - 异步编程中的最佳实践 - 配置上下文

您对返回类型的猜测是正确的。

我会避免包装太多,因为它增加了分配和委托调用。

对于同步部分,我会做这样的事情:

public TOut WithThing<TOut>(Func<T, TOut> func)
{
  Someting();
  return func(thing);
}

public void WithThing(Action<T> action)
{
  Someting();
  action(x);
}

private void Someting()
{
  var thing = CreateThing();
  thing.DoSomething();
}

对于异步:

public async Task<TOut> WithThing<TOut>(Func<T, Task<TOut>> func)
{
  await SometingAsync();
  return await func(thing).ConfigureAwait(false);
}

public async Task WithThing(Func<Task> action)
{
  await SometingAsync();
  await action(thing).ConfigureAwait(false);
}

private void SometingAsync()
{
  var thing = CreateThing();
  await thing.DoSomethingAsync().ConfigureAwait(false);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将带有异步方法调用的if条件集转换为Dictionary?

在VB.NET中将带有事件的异步调用转换为同步

将带有字符串数组作为参数的glib C方法转换为Go

将带有附加参数的curl转换为PHP curl

将带有查询参数的 URL 转换为 guzzle

将带有 out 参数的块体方法转换为表达式体方法会导致 out 参数为空

正确的方法来将带有解析和拒绝的承诺转换为异步功能(伪造者)

将带有 ">=" 的参数传递给 argparse

将带有参数的方法传递给包装器组件

将带有.Select()方法的LINQ方法语法转换为LINQ查询语法

将带有回调的方法转换为通过清除返回诺言的方法

使用async / await将现有的C#同步方法转换为异步方法?

在Python Pandas中将带有$的货币转换为数字

将带有嵌套标头的CSV转换为JSON

使用iText将带有图像的HTML转换为PDF

将带有dict的数组转换为变量

将带有日期的列转换为R中的行

从python将带有内部条件的循环转换为lang

将带有列表的字典转换为熊猫数据框

将带有变量的循环转换为 BigQuery SQL

将带有地图的对象列表转换为基元数组

将带有空格的数据转换为数据框

将带有赋值的循环转换为理解

将带有项目的路径转换为树对象

python将带有子列表的列表转换为字典

将带有长变量的Java函数转换为NodeJS

将带有continue语句的for循环转换为while循环

Javascript将带有子对象的对象转换为数组

将带有列表的字典转换为IEnumerable