2

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

当我调用这一行时:

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

ControllerClass.DoSomething("data") 未执行。

但是,如果我添加一个等待,那么该方法就会被调用。

我使用 LongRunning 选项的原因是该方法可以是 LongRunning 在某些事情开始执行时没有到位。是的,该方法本身在内联调用时有效。只是它需要在一个线程中,以便主程序可以在该线程执行其操作时继续。

顺便说一句,我也尝试过这种方式来调用它并且结果相同:

 Task.Factory.StartNew(() =>
 ControllerClass.DoSomething("data")).ContinueWith
        (t =>
        {
            SendErrorEmail(t.Exception);
        }, TaskContinuationOptions.OnlyOnFaulted
        );

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

4

1 回答 1

4

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

不,这不会发生。实际上,当你写这个时:

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

在掩护下,您的任务是进入队列,迟早会在ThreadPool.

根据MSDN

调用 StartNew 在功能上等同于使用其构造函数之一创建一个 Task,然后调用 Start 来安排它的执行。

关于你的其他说法:

但是,如果我添加一个等待,那么该方法就会被调用。

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

如果当前任务尚未开始执行,Wait 方法会尝试从调度程序中删除任务并在当前线程上内联执行它。如果它不能这样做,或者当前任务已经开始执行,它会阻塞调用线程,直到任务完成。

简而言之Wait就是一个阻塞动作。

请在此处查看有关此内容的更多信息。

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

不,据我所知,除非调用 wait ,否则别无选择。

于 2015-10-08T19:36:21.833 回答