【问题标题】:Action<T> Fire and forget?Action<T> 触发并忘记?
【发布时间】:2011-04-13 22:29:07
【问题描述】:

可以安全地使用 Action 以这种方式从本质上触发并忘记返回类型为 void 的方法吗?

    public static void BeginAction(Foo input, Action<Foo> action)
    {
        action.BeginInvoke(input, EndAction, action); 
    }

    public static void EndAction(IAsyncResult result)
    {
        (result.AsyncState as Action).EndInvoke(result); 
    }

【问题讨论】:

    标签: c# asynchronous delegates action


    【解决方案1】:

    如果您确保致电EndInvoke(),则可以。如果您忘记调用 EndInvoke() 并且 Action 有返回值或引发异常,则可能导致资源未被释放(.NET 不会丢弃结果或异常,它将保留它们直到 @ 987654323@电话认领他们)。

    【讨论】:

    • 我将使用它异步地将记录复制到数据库中,'Foo' 将是要复制的对象列表。永远不会有返回值,但我会记录任何异常。不确定它是否建议..
    • 最佳实践始终是构建代码以保证调用EndInvoke()。如果委托背后的方法引发异常,则调用 EndInvoke() 将重新引发相同的异常实例。但是,如果异步方法有它自己的异常处理并保证(a)方法返回 void 和(b)方法永远不会产生异常,那么你是安全的
    【解决方案2】:

    您会遇到的一个问题是应用程序关闭。当用户想要关闭您的应用程序时,您如何 (a) 等待所有这些“即发即弃”操作完成,或 (b) 优雅地终止它们?

    如果您需要担心这些事情中的任何一个,那么“即发即弃”可能效果不佳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2010-10-22
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      相关资源
      最近更新 更多