如何在方法内部使用await关键字而不更改方法异步

穆吉尔·迪皮(Mukil Deepthi)

我正在开发一个计划的作业,以使用Quartz.net将消息发送到消息队列。IJob的Execute方法不是异步的。所以我不能使用异步任务。但是我想用await关键字调用一个方法。

请在下面找到我的代码。不知道我做的是否正确。谁能帮我这个忙吗?

private async Task PublishToQueue(ChangeDetected changeDetected)
{
    _logProvider.Info("Publish to Queue started");

    try
    {
       await _busControl.Publish(changeDetected);

        _logProvider.Info($"ChangeDetected message published to RabbitMq. Message");
    }
    catch (Exception ex)
    {
        _logProvider.Error("Error publishing message to queue: ", ex);

        throw;
    }
}

public class ChangedNotificatonJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
                    //Publish message to queue
                    Policy
                        .Handle<Exception>()
                        .RetryAsync(3, (exception, count) =>
                        {
                            //Do something for each retry
                        })
                        .ExecuteAsync(async () =>
                        {
                            await PublishToQueue(message);
                        });
    }
}

这是正确的方法吗?我用过.GetAwaiter();

Policy
        .Handle<Exception>()
        .RetryAsync(_configReader.RetryLimit, (exception, count) =>
        {
            //Do something for each retry
        })
        .ExecuteAsync(async () =>
        {
            await PublishToQueue(message);
        }).GetAwaiter()
登山旅行者

Polly.ExecuteAsync()返回Task使用any Task,您可以仅调用.Wait()它(或其他阻止方法)来同步阻止,直到它完成或引发异常。

如您所见,既然IJob.Execute(...)不是async,就不能使用await,因此,如果您想发现成功或以其他方式在IJob.Execute(...)返回之前进行发布,则别无选择,只能同步阻止任务

.Wait()将导致任务中的任何异常被重新抛出,并包装在中AggregateException如果所有由Polly精心安排的重试均失败,则会发生这种情况。

您需要决定如何处理该异常:

  • 如果您希望调用者处理它,则将其重新抛出或不捕获它,并使其在Quartz作业之外进行级联。

  • 如果您想在返回前处理它IJob.Execute(...),则需要一个try {} catch {}整体.ExecuteAsync(...).Wait()或考虑Polly的.ExecuteAndCaptureAsync(...)语法:通过将执行的最终结果放入PolicyResult实例中,可以避免提供外部try-catch的麻烦。参见Polly doco


如果您的唯一目的是在消息发布失败的地方进行日志记录,并且您不在乎该日志记录是否发生在IJob.Execute(...)返回之前,则还有另一种选择在这种情况下,.Wait()您可以将延续任务链接到ExecuteAsync()using,而不是using .ContinueWith(...),并在那里处理任何登录。我们采用这种方法,并且将失败的消息发布捕获到特殊的“消息医院”中-捕获足够的信息,以便我们可以选择是否稍后再重新发布该消息(如果适用)。这种方法是否有价值,取决于对您永不丢失信息的重要性。


编辑:GetAwaiter()是无关紧要的。它不会神奇地让您开始await在非async方法内部使用

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

总是在库的异步方法中使用'async'和'await'关键字吗?

来自分类Dev

为什么需要使用 await 关键字来调用异步方法

来自分类Dev

在对象的方法内部使用“ this”关键字

来自分类Dev

在对象的方法内部使用“ this”关键字

来自分类Dev

如何使用await关键字?

来自分类Dev

为什么带有 await 关键字的异步方法仍然阻塞主线程?

来自分类Dev

如何使用async和await关键字进行异步调用

来自分类Dev

如何在类的方法内部的事件侦听器内使用“ this”关键字,而又不会丢失对类参数和方法参数的访问?

来自分类Dev

如何在方法中使用make“ using”关键字将其接受为类级别

来自分类Dev

在方法中使用“self”关键字

来自分类Dev

如何在targeting.net 4.0项目中使用异步关键字

来自分类Dev

Ruby:使用self关键字从内部调用私有方法

来自分类Dev

如何在PhpStorm中更改特定关键字的颜色?

来自分类Dev

tsc 不会让我使用 await 关键字进行编译,甚至认为我使用的函数是异步的

来自分类常见问题

如何在基于块的API方法中使用非空和可空的Objective-C关键字

来自分类Dev

如何在javascript中使用new关键字为一个对象赋予属性和方法?

来自分类Dev

如何在不使用 extends 关键字的情况下从另一个类访问方法?

来自分类Dev

当不使用async / await关键字时,为什么异步单元测试失败?

来自分类Dev

VueJS-无法在异步函数外使用关键字“ await”

来自分类Dev

如何使用IN关键字?

来自分类Dev

Chrome:如何搜索不包含特定关键字的关键字,而无需每次都更改设置

来自分类Dev

如何使用Codedom在方法签名中创建带有'new'关键字的方法

来自分类Dev

如何使用Codedom在方法签名中创建带有'new'关键字的方法

来自分类Dev

如何在lambda方法中传递参数和async关键字?

来自分类Dev

如何在sklearn管道中将关键字参数传递给预测方法

来自分类Dev

如何在本地反应上使用等待关键字?

来自分类Dev

如何在Scala中使用“元组”关键字?

来自分类Dev

如何在模板类中使用friend关键字

来自分类Dev

如何在Haskell中使用“ aux”关键字

Related 相关文章

  1. 1

    总是在库的异步方法中使用'async'和'await'关键字吗?

  2. 2

    为什么需要使用 await 关键字来调用异步方法

  3. 3

    在对象的方法内部使用“ this”关键字

  4. 4

    在对象的方法内部使用“ this”关键字

  5. 5

    如何使用await关键字?

  6. 6

    为什么带有 await 关键字的异步方法仍然阻塞主线程?

  7. 7

    如何使用async和await关键字进行异步调用

  8. 8

    如何在类的方法内部的事件侦听器内使用“ this”关键字,而又不会丢失对类参数和方法参数的访问?

  9. 9

    如何在方法中使用make“ using”关键字将其接受为类级别

  10. 10

    在方法中使用“self”关键字

  11. 11

    如何在targeting.net 4.0项目中使用异步关键字

  12. 12

    Ruby:使用self关键字从内部调用私有方法

  13. 13

    如何在PhpStorm中更改特定关键字的颜色?

  14. 14

    tsc 不会让我使用 await 关键字进行编译,甚至认为我使用的函数是异步的

  15. 15

    如何在基于块的API方法中使用非空和可空的Objective-C关键字

  16. 16

    如何在javascript中使用new关键字为一个对象赋予属性和方法?

  17. 17

    如何在不使用 extends 关键字的情况下从另一个类访问方法?

  18. 18

    当不使用async / await关键字时,为什么异步单元测试失败?

  19. 19

    VueJS-无法在异步函数外使用关键字“ await”

  20. 20

    如何使用IN关键字?

  21. 21

    Chrome:如何搜索不包含特定关键字的关键字,而无需每次都更改设置

  22. 22

    如何使用Codedom在方法签名中创建带有'new'关键字的方法

  23. 23

    如何使用Codedom在方法签名中创建带有'new'关键字的方法

  24. 24

    如何在lambda方法中传递参数和async关键字?

  25. 25

    如何在sklearn管道中将关键字参数传递给预测方法

  26. 26

    如何在本地反应上使用等待关键字?

  27. 27

    如何在Scala中使用“元组”关键字?

  28. 28

    如何在模板类中使用friend关键字

  29. 29

    如何在Haskell中使用“ aux”关键字

热门标签

归档