繁体   English   中英

Task.Factory.StartNew中的方法(动作)调用不会立即被调用

[英]Method (Action) call in Task.Factory.StartNew not being invoked immediately

我的印象是我可以进行此线程调用,而我的方法“ 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
        );

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

我的印象是我可以进行此线程调用,而我的方法“ DoSomething”中的任何内容都将开始发生,但显然不会发生。

不,这没有发生。 实际上,当您编写此代码时:

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

在后台,您的任务进入了队列,迟早将在ThreadPool的线程上运行。

根据MSDN

调用StartNew在功能上等效于使用其构造函数之一创建Task,然后调用Start安排其执行时间。

向您发表其他声明:

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

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

如果当前任务尚未开始执行,则Wait方法尝试从调度程序中删除该任务,并在当前线程上内联执行它。 如果无法执行此操作,或者当前任务已经开始执行,则它将阻塞调用线程,直到任务完成。

简而言之, Wait是一项阻止性操作。

请在这里查看更多信息。

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

不。据我所知,除非致电等待,否则别无选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM