我正在构建一个多线程 ASP.NET 应用程序。我是编写多线程应用程序的新手。我有一个主类,它产生许多在使用应用程序时运行的线程。该应用程序有一个主要的 HTML 页面。当 HTML 页面第一次打开时,它调用 MyController.Start() 方法来创建线程并让它们运行。然后 HTML 页面有一个 Javascript 例程,它不断地轮询我的应用程序中的 ASPX 页面(每 2 秒)以获取数据并显示它。有一个我称为“MyController”的主类,它是应用程序的核心。它有一个名为 Canceled 的本地布尔变量,该变量设置为 false。MyController 产生所有子线程。每个子线程都有一个循环,只要 Canceled = false 就会继续执行。正在运行的线程之一用作监视器,以确保 HTML 页面仍处于启动状态并进行轮询。如果该线程注意到自上次轮询 HTML 页面以来已过 30 秒,则它将 Canceled 变量更改为 true。然后所有线程一个接一个地完成运行并优雅地关闭。
我需要能够处理用户关闭浏览器然后在 30 秒到期之前重新打开它的情况。我觉得我没有完全理解创建和启动的线程与 MyController 实例之间的关系。一旦线程被创建并启动,它们是否会独立于其他任何东西运行?我有一个名为 App 的主要静态类,用于从应用程序的任何位置轻松访问控制器。我现在编码的方式我认为每次加载 HTML 页面时我都会创建新线程。因此,如果用户要关闭 HTML 页面然后重新打开它,我想我会运行每个线程的两个实例。那是对的吗?如果是这样,我如何检查这些线程是否已经在运行,以便我不'
希望这是有道理的!提前感谢您的帮助。这是我的代码。
启动.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if(App._myController == null)
{
App._myController = new MyController();
}
App._myController.Start();
}
库代码
public class App
{
public static MyController _myController {get;set;}
static App()
{
_myController = new MyController();
}
}
public class MyController
{
public bool Cancelled {get;set;}
private object SyncLock = new object();
Thread _thread1;
Thread _thread2;
Thread _thread3;
public void Start()
{
this.Cancelled = false;
_thread1 = new Thread(Worker1);
_thread1.Start();
_thread2 = new Thread(Worker2);
_thread2.Start();
_threadMonitor = new Thread(Monitor);
_threadMonitor.Start();
}
public void Stop()
{
lock(this.SyncLock)
{
this.Cancelled = true;
}
}
private void Worker1()
{
while(!Cancelled)
{
..do some stuff..
}
}
private void Worker2()
{
while(!Cancelled)
{
..do some stuff..
}
}
private void Monitor()
{
while(!Cancelled)
{
..check database to see when last poll was
..if last poll is greater than 30 seconds ago
{
this.Stop();
}
}
}
}