在处理所有事件之前,应用程序退出-基于事件的异步模式

萨哈什

我正在尝试以下描述的基于事件的异步示例:https : //docs.microsoft.com/zh-cn/dotnet/standard/asynchronous-programming-patterns/component-that-supports-the-event-based-asynchronous-模式

PrimeNumberCalculator我写课程与本文中描述的完全相同。我编写了一个简单的客户端控制台应用程序,以调用Calculate方法,如下所示:


        //------------CONSOLE APP MAIN------------
        static void Main(string[] args)
        {
            CalculatePrimeNumbers();
            Console.WriteLine("Application will exit here. Press a key");
            Console.ReadKey();
        }

        //------------CALLING CODE-----------
        static void CalculatePrimeNumbers()
        {
            PrimeNumberCalculator primeNumberCalculator = new PrimeNumberCalculator();

            //setup event handlers
            primeNumberCalculator.CalculatePrimeCompleted +=
                new CalculatePrimeCompletedEventHandler(primeNumberCalculator_CalculatePrimeCompleted);
            primeNumberCalculator.ProgressChanged +=
                new ProgressChangedEventHandler(primeNumberCalculator_ProgressChanged);

            for (int i = 0; i < 100; i++)
            {
                Random rand = new Random();
                int testNumber = rand.Next(200);
                Thread.Sleep(20);
                Guid taskId = Guid.NewGuid();
                Console.WriteLine($"{taskId} - Starting for {testNumber}");
                primeNumberCalculator.CalculatePrimeAsync(testNumber, taskId);
            }
        }

        //------------CALCULATION COMPLETED EVENT HANDLER------------
        static private void primeNumberCalculator_CalculatePrimeCompleted(
            object sender, CalculatePrimeCompletedEventArgs e)
        {
            //await Task.Yield();
            Guid taskId = (Guid)e.UserState;
            Console.WriteLine($"{taskId} - Whole process completed");
        }

        //------------CALCULATION PROGRESSED EVENT HANDLER------------
        static private void primeNumberCalculator_ProgressChanged(ProgressChangedEventArgs e)
        {
            Guid taskId = (Guid)e.UserState;
            Console.WriteLine($"{taskId} - {e.ProgressPercentage}%");
            DoSomethingImportant(taskId);
        }

        //------------POST PROCESSING WORK------------
        static void DoSomethingImportant(Guid guid)
        {
            //necessary Work to be done on completion/progress;
        }

当我运行此代码时,代码将按预期的方式工作,但是在处理了许多进度和已完成的事件之后,在应用程序退出该行之后会处理一些事件 Console.WriteLine("Application will exit here. Press a key");

3d744ab4-6d2c-4949-a1ec-ce22718daa1f - Starting for 169
d73dc2c4-a93b-49a2-8608-b2d180884295 - 69%
d73dc2c4-a93b-49a2-8608-b2d180884295 - 77%
d73dc2c4-a93b-49a2-8608-b2d180884295 - 80%
2ae4ab62-1479-4360-8e35-fdf747ed3f93 - 8%
f48a77d5-e349-4ff5-889d-c019c759a527 - Starting for 34
Application will exit here. Press a key
2ae4ab62-1479-4360-8e35-fdf747ed3f93 - 78%
f48a77d5-e349-4ff5-889d-c019c759a527 - 50%
f48a77d5-e349-4ff5-889d-c019c759a527 - 55%
f48a77d5-e349-4ff5-889d-c019c759a527 - 67%
f48a77d5-e349-4ff5-889d-c019c759a527 - 85%
f48a77d5-e349-4ff5-889d-c019c759a527 - 91%
f48a77d5-e349-4ff5-889d-c019c759a527 - Whole process completed
f48a77d5-e349-4ff5-889d-c019c759a527 - 14%
2ae4ab62-1479-4360-8e35-fdf747ed3f93 - 13%
d73dc2c4-a93b-49a2-8608-b2d180884295 - 4%
2ae4ab62-1479-4360-8e35-fdf747ed3f93 - 15%
f48a77d5-e349-4ff5-889d-c019c759a527 - 38%
f48a77d5-e349-4ff5-889d-c019c759a527 - 20%
f48a77d5-e349-4ff5-889d-c019c759a527 - 32%

在上面的输出中,在该"Application will exit here. Press a key"之后处理了多个事件,这将有效地跳过事件处理程序为这些任务进行的任何后处理。

问题

  1. 这是预期的还是我在处理程序中缺少了某些内容?我想避免这种情况的一种方法是跟踪正在执行的计算(任务)的数量,在引发“已完成”事件处理程序时将其选中,然后坚持应用程序直到所有机上计算已完成。

  2. 有没有推荐的方法来确保所有事件在应用程序退出之前得到处理?

加布里埃尔·卢西(Gabriel Luci)

基于事件的异步编程模式依靠事件来告诉您作业何时完成。您的Main代码中没有任何内容可以告诉它等待所有完成事件触发。

您可以使用CountdownEvent来做到这一点。从100开始计数:

static CountdownEvent cde = new CountdownEvent(100);

primeNumberCalculator_CalculatePrimeCompleted通过调用减去一个Signal()

cde.Signal();

然后等待,直到方法中的计数为0 Main

cde.Wait();

另一个选择是改为使用基于任务的异步模式然后,您可以保留所有任务的列表,并用于Task.WhenAll异步等待它们。本文也可以提供帮助:使用async和await进行异步编程

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

包装使用基于事件的异步模式的库,以用于Async / Await

来自分类Dev

是否调用.click(); 总是在返回之前调用所有事件处理程序?

来自分类Dev

从iOS中的设备删除应用程序后,如何删除“我的应用程序日历”中的所有事件

来自分类Dev

如何删除所有事件处理程序

来自分类Dev

同时打印所有子代的所有事件和事件处理程序

来自分类Dev

基于事件的异步模式实现是否总是捕获当前的同步上下文?

来自分类Dev

将命名和订阅的日历导入到应用程序中并显示所有事件

来自分类Dev

在nodejs express模块中处理所有事件之前发送响应

来自分类Dev

如何使用Chrome查看DOM中的所有事件处理程序

来自分类Dev

如何调用所有事件处理程序订阅者并获取结果?

来自分类Dev

所有事件处理程序被同步触发是什么意思?

来自分类Dev

如何在Windows App中删除所有事件处理程序?

来自分类Dev

取消 DataGridViewCellValidatingEventArgs 如何用自身替换所有事件处理程序?

来自分类Dev

Qt在没有事件监听器的情况下获取应用程序状态

来自分类Dev

是否有事件显示Windows中的应用程序启动和活动?

来自分类Dev

如何提前安排时间并处理所有事件

来自分类Dev

Spring批处理JdbcPagingItemReader无法读取所有事件

来自分类Dev

了解带有事件处理程序的javascript闭包

来自分类Dev

如何更改现有事件处理程序的名称?

来自分类Dev

编写应用程序事件处理程序

来自分类Dev

获取应用程序的所有触摸事件

来自分类Dev

所有应用程序的“拦截会话开始”事件

来自分类Dev

AWS Eventbridge:捕获所有事件的模式

来自分类Dev

如何在执行某些操作后解除所有事件处理程序的绑定并重新绑定它们?

来自分类Dev

Mvvmcross:处理全局应用程序事件

来自分类Dev

在Flask中的事件传播到更特定的应用程序路由之前对其进行处理

来自分类Dev

具有状态事件args的异步事件处理程序

来自分类Dev

带有和不带有事件处理程序的javascript中事件的不同行为

来自分类Dev

AS3是否有一个事件供Android应用程序自行退出?

Related 相关文章

  1. 1

    包装使用基于事件的异步模式的库,以用于Async / Await

  2. 2

    是否调用.click(); 总是在返回之前调用所有事件处理程序?

  3. 3

    从iOS中的设备删除应用程序后,如何删除“我的应用程序日历”中的所有事件

  4. 4

    如何删除所有事件处理程序

  5. 5

    同时打印所有子代的所有事件和事件处理程序

  6. 6

    基于事件的异步模式实现是否总是捕获当前的同步上下文?

  7. 7

    将命名和订阅的日历导入到应用程序中并显示所有事件

  8. 8

    在nodejs express模块中处理所有事件之前发送响应

  9. 9

    如何使用Chrome查看DOM中的所有事件处理程序

  10. 10

    如何调用所有事件处理程序订阅者并获取结果?

  11. 11

    所有事件处理程序被同步触发是什么意思?

  12. 12

    如何在Windows App中删除所有事件处理程序?

  13. 13

    取消 DataGridViewCellValidatingEventArgs 如何用自身替换所有事件处理程序?

  14. 14

    Qt在没有事件监听器的情况下获取应用程序状态

  15. 15

    是否有事件显示Windows中的应用程序启动和活动?

  16. 16

    如何提前安排时间并处理所有事件

  17. 17

    Spring批处理JdbcPagingItemReader无法读取所有事件

  18. 18

    了解带有事件处理程序的javascript闭包

  19. 19

    如何更改现有事件处理程序的名称?

  20. 20

    编写应用程序事件处理程序

  21. 21

    获取应用程序的所有触摸事件

  22. 22

    所有应用程序的“拦截会话开始”事件

  23. 23

    AWS Eventbridge:捕获所有事件的模式

  24. 24

    如何在执行某些操作后解除所有事件处理程序的绑定并重新绑定它们?

  25. 25

    Mvvmcross:处理全局应用程序事件

  26. 26

    在Flask中的事件传播到更特定的应用程序路由之前对其进行处理

  27. 27

    具有状态事件args的异步事件处理程序

  28. 28

    带有和不带有事件处理程序的javascript中事件的不同行为

  29. 29

    AS3是否有一个事件供Android应用程序自行退出?

热门标签

归档