C# 最佳行动。Invoke、Action.BeginInvoke和Task.Factory.StartNew for fire&;忘记方法

C# 最佳行动。Invoke、Action.BeginInvoke和Task.Factory.StartNew for fire&;忘记方法,c#,winforms,asynchronous,delegates,C#,Winforms,Asynchronous,Delegates,我需要在后台运行类方法。 此方法将是fire&forget,没有返回值。 它可以使用不同的参数同时运行多次。 我不会做这个背景工作,干扰主应用程序 它应该作为新线程完成吗?异步? 我在这里感到困惑。 下面是一些代码片段 private void timerAction_Tick(object sender, EventArgs e) { Action actionTask = () => new StuffService().FireAndForgetCommand();

我需要在后台运行类方法。 此方法将是fire&forget,没有返回值。 它可以使用不同的参数同时运行多次。 我不会做这个背景工作,干扰主应用程序

它应该作为新线程完成吗?异步? 我在这里感到困惑。 下面是一些代码片段

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++)
        { }
    } 
 }
private void timerAction_Tick(对象发送方,事件参数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);
}
公共类填充服务
{
公开作废FireAndForgetCommand()
{        
//做一些事情,超过100毫秒
//如果发生异常,则记录它
对于(inti=0;i
我正在努力了解实现这一目标的最佳方式(最节省、最高效……)


或者我应该直接使用吗?

在我看来,这是一个简单的任务案例。异步似乎不合适,因为它假设它将返回并使用上下文执行一些神奇的操作。使任务异步只是过火了,后台工作人员似乎与任务没有太大区别

此外,您可能希望在某个时候取消作业,以便顺利关闭,任务可以轻松支持这一点,并且您可能希望将其标记为长期运行的任务;这也是一个特点


然而!您的示例表明您将要处理一个富文本框,它与前台线程和调度程序严重纠缠在一起。您可能忘记了任务,但应用程序无法忘记,到达输出的事件顺序可能很重要,并且可能不是您要求的顺序。考虑将一个任务运行为一种服务并发送消息,允许任务适当地管理向您的输出添加行的过程。

为什么在世界上启动一个新线程只是为了立即安排在UI线程中完成的工作?不要那样做。另外,当您刚刚完成移动到非UI线程时,为什么要检查您是否在UI线程中;你知道你在一个非UI线程中,所以没有理由检查。在你链接的帖子中,作者问“在C#中创建非阻塞方法调用的最快方法是什么?”。我想知道什么是fire&forget jobs in background的最佳实践,以及为什么。@我想知道是什么让你认为这两件事是不同的?@Servy我已经编辑了代码。我在前面测试的exampe中做了很多事情。这就是为什么我的问题在这里。我看不出有什么不同。利与弊。没有区别吗?是的。它是重复的。埋葬它):