[英]Using await Task.Factory.StartNew on a method will return immediately
[英]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.