我的印象是我可以直接拨打这个线程,而且我的方法中的任何内容都是" 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
);
我是否缺少一些选项让它立即开始执行方法调用?
答案 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。
我错过了一些选项,告诉它开始执行方法调用 马上?
没有。除非我打算等待,否则没有任何其他选择,据我所知。