我正在构建一个多线程的ASP.NET应用程序。我是编写多线程应用程序的新手。我有一个主类,该主类会生成许多在使用该应用程序时运行的线程。该应用程序有一个主HTML页面。首次打开HTML页面时,它将调用MyController.Start()方法来创建线程并使它们运行。然后,HTML页面具有Javascript例程,该例程连续两次(每2秒)轮询我的应用程序中的ASPX页面以获取数据并显示它。我有一个名为“MyController”的主类,它是应用程序的核心。它具有一个名为Cancelled的局部 bool 变量,该变量设置为false。 MyController产生所有的子线程。每个子线程都有一个循环,只要Canceled = false,该循环就会继续执行。正在运行的线程之一用作监视器,以确保HTML页面仍在启动并正在轮询。如果此线程注意到自上次轮询HTML页面以来30秒钟已过期,则它将Canceled变量更改为true。然后所有线程一个接一个地完成运行并正常关闭。
我需要能够处理用户关闭浏览器,然后在30秒到期之前重新打开它的情况。我觉得我不完全了解要创建和启动的线程与MyController实例之间的关系。一旦创建并启动线程,它们是否将独立于其他任何线程运行?我有一个名为App的主静态类,该类用于提供从应用程序中任何位置的 Controller 的轻松访问。我现在的编码方式是,我认为每次加载HTML页面时,我都会创建新的线程。因此,如果用户要关闭HTML页面然后重新打开它,那么我想每个线程都会有两个实例。那是对的吗?如果是这样,我如何检查那些线程是否已经在运行,以便不创建它们的新实例?
希望这是有道理的!在此先感谢您的帮助。这是我的代码。
Start.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();
}
}
}
}
最佳答案
我不喜欢您的设计,但这是一个单独的问题。我将用您当前的设计解决您当前的问题...
在Start()
函数中,如果线程不为空,则将Cancelled
设置为true,然后将Join()
设置为线程,然后继续使用现有功能。
public void Start()
{
this.Cancelled = true;
if (_thread1 != null) _thread1.Join();
// repeat for other threads
this.Cancelled = false;
_thread1 = new Thread(Worker1);
_thread1.Start();
_thread2 = new Thread(Worker2);
_thread2.Start();
_threadMonitor = new Thread(Monitor);
_threadMonitor.Start();
}
至于更好的方法,也许是一项服务,它可以使用WCF(也许使用REST)来进行与页面交互的后台工作。
关于c# - C#-如何在ASP.NET应用程序中处理子线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14241064/