C# 未立即调用Task.Factory.StartNew中的方法(操作)调用
我的印象是,我可以进行这个线程调用,而我的方法中的任何内容都会开始发生,但显然不会 当我调用这一行时:C# 未立即调用Task.Factory.StartNew中的方法(操作)调用,c#,multithreading,taskfactory,C#,Multithreading,Taskfactory,我的印象是,我可以进行这个线程调用,而我的方法中的任何内容都会开始发生,但显然不会 当我调用这一行时: Task.Factory.StartNew(() => ControllerClass.DoSomething("data"), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default); ControllerClass.DoSomethingdata未执行 但是,如果我添加一个
Task.Factory.StartNew(() =>
ControllerClass.DoSomething("data"),
CancellationToken.None,
TaskCreationOptions.LongRunning, TaskScheduler.Default);
ControllerClass.DoSomethingdata未执行
但是,如果我添加一个Wait,那么就会调用该方法
我使用LongRunning选项的原因是,当方法开始执行时,如果某些东西不在适当的位置,则该方法可以长时间运行。是的,方法本身在内联调用时可以工作。只是它需要在一个线程中,以便主程序可以在该线程执行其任务时继续
顺便说一句,我也试着用这种方式来称呼它,结果是一样的:
Task.Factory.StartNew(() =>
ControllerClass.DoSomething("data")).ContinueWith
(t =>
{
SendErrorEmail(t.Exception);
}, TaskContinuationOptions.OnlyOnFaulted
);
我是否缺少告诉它立即开始执行方法调用的选项
我的印象是我可以打这个线程调用
无论我的方法是什么,都会发生一些事情,
但显然不是
不,这不会发生。实际上,当你写这篇文章时:
Task.Factory.StartNew(() =>
ControllerClass.DoSomething("data"),
CancellationToken.None,
TaskCreationOptions.LongRunning, TaskScheduler.Default);
在这种情况下,您的任务是进入队列,并且迟早会在线程池的线程上运行
根据:
调用StartNew在功能上等同于创建
任务使用其构造函数之一,然后调用Start to
计划执行
拉加丁你还有其他声明:
但是,如果我添加一个Wait,那么就会调用该方法
这是正确的,因为TaskFactory.StartNew返回任务对象。当我们调用任务的Wait方法时
如果当前任务尚未开始执行,则等待方法
尝试从计划程序中删除任务并内联执行
在当前线程上。如果无法做到这一点,或者如果当前
任务已开始执行,它将阻止调用线程,直到
任务完成了
简单地说,等待是一种阻碍行为
请查看更多关于此的信息
我是否缺少告诉它开始执行方法调用的选项
马上
不。除非调用wait,否则就我所知,没有其他选择。请注意,无论您是否等待任务,您的任务始终会被执行。在另一个线程上调用内容,特别是当您将此任务委托给其他人时,并不具有确定性,您无法知道它将在何时发生。它会发生,就像,无论什么时候,所以你知道,就像,冷静下来,诸如此类。它应该立即发生,除非你没有线索。好的。但是当我在单元测试中调用它时,单元测试结束了,什么也没有发生。我认为,因为这是主调用者的子线程,所以程序不会在线程有机会做某事之前结束,即使我没有这样做;t调用Wait。@user1013388它在后台线程上运行,因此主线程将在不等待的情况下结束。默认任务计划程序使用专用线程而不是线程池来处理带有TaskCreationOptions.LongRunning选项的任务。