Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未立即调用Task.Factory.StartNew中的方法(操作)调用_C#_Multithreading_Taskfactory - Fatal编程技术网

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选项的任务。