当前位置: 首页 > 知识库问答 >
问题:

为什么在我的任务中添加。wait()有时会允许任务使用主线程?

须敏学
2023-03-14

我试图理解异步是如何工作的,但有一种情况我已经简化到了极致,我找不到任何解释。

在项目上mvc ASP.NET framework 4.6:

...
public class Test {
    public static void Work(int id) {

        if (id == Thread.CurrentThread.ManagedThreadId) {
            Debug.WriteLine("******************************");
            Debug.WriteLine("***     BOOOMMMM !!!!!!!   ***");
            Debug.WriteLine("******************************");
        }
    }
}

public class HomeController : Controller {
    public ActionResult Index() {
        var id = Thread.CurrentThread.ManagedThreadId;
        Task.Run(() => { Test.Work(id); });

        return View();
    }
...

当我执行上面的代码时:

if (id == Thread.CurrentThread.ManagedThreadId)

从未验证过。DoWork()运行在另一个线程上,而不是我的主线程上。对我来说,这是正常的,这是我在阅读过程中一直明白的。

但如果我在任务上放一个等待。快跑

Task.Run(() => { Test.Work(id); }).Wait();

有时它是另一个线程而不是主要的,有时它不是,我不明白。

这里写着:

运行在线程池上启动一个任务来进行计算。ASP.NET线程池必须处理在此请求期间(意外地)丢失其线程之一的情况。

好吧,在他的例子中没有Wait(),但是这有什么区别呢,Wait()是在Work()之后调用的,所以不管有没有Wait(),Work()都应该具有相同的行为。

如果有人能给我一个解释,我将非常感激。

共有1个答案

贺亦
2023-03-14

当您等待时,TPL可以将任务内联到当前线程中。如果任务尚未在另一个线程上启动,则可能发生这种情况。它是一种性能优化。

它是一个非常有争议的特性,将微妙的bug注入到应用程序中。本质上,任务上的任何等待都可以不确定地运行任意代码。

 类似资料:
  • 清理用户需要清理2个表,新建类net.wendal.nutzbook.quartz.job.CleanNonActiveUserJob package net.wendal.nutzbook.quartz.job; import java.util.Date; import net.wendal.nutzbook.bean.User; import net.wendal.nutzbook.be

  • 本文向大家介绍微任务和宏任务有什么区别?相关面试题,主要包含被问及微任务和宏任务有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 宏任务:script整体代码、setTimeout、setInterval... 微任务:Promise.then、Object.observe、process.nextTick... 运行机制:当前宏任务执行结束 -> 是否有微任务 --> 执行当前微任务 --

  • 我有一个文件,看起来像这样 wsimport任务从wsdl文件生成所需的一些java文件。生成需要一些时间,所以我不希望每次构建jar或编译程序时都执行它。 wsclean任务旨在当wsdl发生更改时使用。 首先,我运行wsimport任务并确认文件生成正确,它们就是! 但是现在,当我运行gradle jar时,生成的文件被删除了。为什么? 当我注释掉wsclean任务时,jar任务成功地继续。为

  • 看起来是这样的 我来来回回地想弄清楚这到底是怎么回事。有些东西不能直接开箱操作,这似乎很奇怪。有人面临类似的问题吗?

  • 任务是项目管理中最小单位。任务是一个具体的工作,有明确的负责人和截止时间,比如需要在某个特定的时间段内完成某项工作。

  • 我已经安排了一个任务来启动批处理文件。当我使用选项运行任务时 仅在用户登录时运行 一切正常。 我想在后台运行此任务,因此我使用选项运行它 无论用户是否登录,运行。 现在,当我在该参数下运行任务时,它不起作用。我得到以下两个错误: < li >任务计划程序无法启动任务“\stmm\Daemon”的实例“{ 2a 7cc 950-fad 9-4633-9701-af 75 a 0 FD 220d }”