不立即调用Task.Factory.StartNew中的方法(Action)调用

时间:2015-10-08 19:28:53

标签: c# multithreading taskfactory

我的印象是我可以直接拨打这个线程,而且我的方法中的任何内容都是" DoSomething"会开始发生,但显然不是。

当我调用此行时:

Task.Factory.StartNew(() => 
ControllerClass.DoSomething("data"), 
CancellationToken.None, 
TaskCreationOptions.LongRunning, TaskScheduler.Default);

ControllerClass.DoSomething(" data")未执行。

但是,如果我添加一个Wait,那么该方法将被调用。

我使用LongRunning选项的原因是该方法可能是LongRunning,在某些事情开始执行时就不存在了。是的,该方法本身在内联调用时有效。它只是需要在一个线程中,以便主程序可以继续,而这个线程做它的事情。

顺便说一下,我也尝试过这种方式来调用它并得到相同的结果:

 Task.Factory.StartNew(() =>
 ControllerClass.DoSomething("data")).ContinueWith
        (t =>
        {
            SendErrorEmail(t.Exception);
        }, TaskContinuationOptions.OnlyOnFaulted
        );

我是否缺少一些选项让它立即开始执行方法调用?

1 个答案:

答案 0 :(得分:4)

  

我的印象是我可以调用此线程   无论我的方法是什么,“DoSomething”才会开始发生,   但显然不是。

不,这不会发生。实际上,当你写这个:

Task.Factory.StartNew(() => 
    ControllerClass.DoSomething("data"), 
    CancellationToken.None, 
    TaskCreationOptions.LongRunning, TaskScheduler.Default);

在封面下你的任务进入队列,迟早会在ThreadPool的一个主题上运行。

根据MSDN

  

调用StartNew在功能上等同于创建一个   任务使用其构造函数之一,然后调用Start to   安排它执行。

指责你的其他陈述:

  

但是,如果我添加一个Wait,那么该方法将被调用。

这是事实,因为TaskFactory.StartNew会返回Task个对象。当我们调用任务的Wait方法时

  

如果当前任务尚未开始执行,则为Wait方法   尝试从调度程序中删除任务并以内联方式执行它   在当前的线程上。如果它无法做到,或当前   任务已经开始执行,它会阻塞调用线程直到   任务完成。

简而言之,Wait是阻止行为。

有关详细信息,请查看here

  

我错过了一些选项,告诉它开始执行方法调用   马上?

没有。除非我打算等待,否则没有任何其他选择,据我所知。