c# - C#-如何在ASP.NET应用程序中处理子线程

标签 c# asp.net multithreading

我正在构建一个多线程的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/

相关文章:

asp.net - 正则表达式 无特殊字符

c# - 在 ASP.NET Core RC2 应用程序中定期运行后台任务

c# - 任务并行库 - Task.Delay() 用法

c - 在linux中调度两个线程两个打印数字模式

c# - 如何获取实现 IMyInterface 的引用中的所有类型

c# - TDD:帮助编写可测试类

c# - 为 Entity Framework 运行自定义工具,它有什么作用?

java - Android 上的多处理

c# - C# 中 'try' 的性能成本

c# - 使用 C# 的 MS Outlook 集成