针对fire&forget方法的Best of Action.Invoke,Action.BeginInvoke和Task.Factory.StartNew

时间:2019-01-08 14:36:33

标签: c# winforms asynchronous delegates

我需要在后台运行类方法。 此方法将立即生效,没有返回值。 它可以同时使用不同的参数多次运行。 我不会从事这项后台工作,以免干扰主应用程序。

应该将其作为新线程吗?作为异步? 我在这里很困惑。 在某些代码段下面。

private void timerAction_Tick(object sender, EventArgs e)
{
    Action actionTask = () => new StuffService().FireAndForgetCommand();
    actionTask.BeginInvoke(actionTask.EndInvoke, null);

    Task.Factory.StartNew(() => new StuffService().FireAndForgetCommand());

    Task.Factory.StartNew(() => new StuffService().FireAndForgetCommand(), TaskCreationOptions.RunContinuationsAsynchronously);
}

public class StuffService
{
   public void FireAndForgetCommand()
   {        
        // do some stuff, longer then 100ms
        // if exception occurs then log it

        for(int i = 0; i < Int32.MaxValue; i++)
        { }
    } 
 }

我正在尝试了解实现此目标的最佳方式(最节省,最有效...)。

或者我应该只使用BackgroundWorker Class吗?

1 个答案:

答案 0 :(得分:-1)

在我看来,就像一个简单的任务案例。异步似乎不合适,因为它假设它将返回并根据上下文执行魔术操作。使任务异步只是矫kill过正,BackgroundWorkers与Tasks似乎并没有太大不同。

此外,您可能希望在某个时候取消作业以正常关闭,任务轻松地支持了该任务,并且您可能希望将其标记为长期运行的任务;也是一个功能。

但是!您的示例建议您将弄乱一个富文本框,该文本框与前景线程和调度程序严重纠缠在一起。您可能会忘记任务,但应用程序却无法,任务到达输出的顺序可能很重要,而可能不是您要求它们的顺序。考虑将单个任务作为一种服务并发送消息,以允许该任务正确管理在输出中添加行的过程。