【问题标题】:Refactoring out part of async method to lambda将异步方法的一部分重构为 lambda
【发布时间】:2013-08-03 08:31:12
【问题描述】:

我对@9​​87654321@ 和await 的概念还很陌生。现在我有这样的东西:

public async void DoSomething()
{
    using (var obj = new SomeClass())
    {
        await obj.SomeAction();
    }

    Done = true;
}

但是随着obj对象的创建和管理变得越来越复杂,我想将它重构为这样的:

public async void DoSomething()
{
    Manager.Execute(obj =>
    {
        await obj.SomeAction();
    });

    Done = true;
}

但是上面的代码不会编译。它肯定在这里或那里缺少一些asyncawait 关键字。我也不知道如何编写Execute() 方法。你能帮忙吗?

【问题讨论】:

  • 你应该避免async void。它不允许调用者知道它何时完成,具有困难的异常处理语义,不能用于单元测试等。

标签: c# .net .net-4.5 async-await c#-5.0


【解决方案1】:

首先,要在 lambdas 中使用 await,您必须使用 async 修饰符来装饰它们,就像方法一样:

Func<Task<Foo>> asyncFooFactory = async () => await whatever;

然后Execute 方法将如下所示:

// instead of Task, you could use void, but then you can't await its completion,
// which could get handy later, depending on your use case
public static async Task Execute(Func<YourClass, Task> externalStuff)
{
    using (var obj = new YourClass()) // replace with your own initializer code
    {
        await externalStuff(obj);
    }
}

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2020-10-25
    • 2019-11-16
    • 1970-01-01
    • 2019-03-26
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多