【问题标题】:.NET Threads are not separate?.NET 线程不是分开的吗?
【发布时间】:2018-12-26 06:57:17
【问题描述】:

我有一个 sub 可以获取视频文件的持续时间。

Async Sub GetDuration(folder As String)

Dim ffP As New FFProbe
Dim vInfo As MediaInfo

Dim totalSecs As Double = Await Task.Run(Function()
                                           vInfo = ffP.GetMediaInfo(filep)
                                           If vInfo.Duration.TotalSeconds < 10
                                            Thread.Sleep(20000)
                                           End If
                                           Return vInfo.Duration.TotalSeconds
                                         End Function)

当我在短视频(少于 10 秒)上运行此程序时,它会按预期使应用程序休眠 20 秒。然而,在浏览器的另一个选项卡上,我在一个长视频(大于 10 秒)上运行它,而第一个线程仍在休眠......但它也休眠,直到 20 秒过期/过去。所以两个标签都在休眠,这向我表明它们实际上是同一个线程。 VB.NET 不应该在使用 Async/Await 对时创建单独的线程吗?

主要想法是让它们分开运行,这样多个用户就可以彼此独立地获得持续时间。

【问题讨论】:

  • 尝试使用Await Task.Delay(TimeSpan.FromSeconds(20.0)) 而不是Thread.Sleep(20000)
  • 这是 ASP.Net 吗?如果是这样并且您使用会话状态,则同一会话中的请求将被序列化 - 即来自第二个选项卡的请求由 IIS 排队,直到第一个完成。
  • 谢谢。那我怎样才能让它创建单独的线程呢? (想法是让它们单独运行,以便多个用户可以获得持续时间)
  • 多个用户将在不同的会话中,所以这应该不是问题。要测试而不是使用第二个标签,请使用新的隐私浏览窗口或不同的浏览器,看看是否会发生同样的事情。

标签: vb.net multithreading asynchronous async-await nreco


【解决方案1】:

异步和等待模式不是多线程。使用相同的线程,但该线程中的进程以某种方式调度,以便线程不被锁定。在 VS 中,您可以检查您在调试期间运行的线程。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2011-06-16
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2010-09-28
相关资源
最近更新 更多