【问题标题】:The correct way to Fire-and-Forget an asynchronous delegateFire-and-Forget 异步委托的正确方法
【发布时间】:2011-02-07 11:58:17
【问题描述】:

认为我对异步委托的主题生疏了。

如果我想以一种即发即弃的方式异步调用一个方法,这是否合适?

Action action = DoSomething;
action.BeginInvoke(action.EndInvoke, null);

DoSomething() 方法捕获所有异常并在内部处理它们。

拨打EndInvoke 合适吗?必需的?

是否有更清晰的方法来实现相同的行为?

【问题讨论】:

    标签: c# asynchronous


    【解决方案1】:

    新方法(在 .NET 4 中)是这样做的:

    Task.Factory.StartNew(() => DoSomething());
    

    【讨论】:

    • Task 对象的处置怎么样?我很想知道您对this question 的看法
    【解决方案2】:

    .NET 3.5 中的“老派”方式是使用ThreadPool

    ThreadPool.QueueUserWorkItem(s => DoSomething());
    

    如果您更喜欢使用异步委托,那么您应该知道对EndInvoke 的调用是必要的,即使您不希望在回调中执行任何其他代码。

    【讨论】:

      【解决方案3】:

      需要注意的是 Task.Factory.StartNew(() => DoSomething()); 未能观察到 DoSomething 方法引发的任何潜在异常。我知道这是人们在启动即发即弃操作时想要的,但就 .Net 4 而言,任何由垃圾收集器完成的未观察到异常的任务都会升级为未处理的异常,这将杀死你的进程.但是,在 .Net 4.5 中,默认行为已更改(请参阅 async 和 await 关键字)。

      【讨论】:

        猜你喜欢
        • 2021-02-13
        • 2014-05-16
        • 2023-01-14
        • 2021-03-14
        • 1970-01-01
        • 2018-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多