asp.net-mvc - 如何判断 MVC AsyncController 线程是否在 ASP.NET 池或 I/O 完成端口中执行

标签 asp.net-mvc multithreading model-view-controller asp.net-mvc-3 asynchronous

我有一个 ASP.NET MVC 3 应用程序。我正在使用 AsyncController 并创建新线程。有没有办法验证我使用的是 I/O 完成端口而不是 ASP.NET 线程池?

Thread.CurrentThread 或其他地方是否有一个属性,我可以检查以确定线程在哪里运行?

这是我正在执行的代码示例

public class HomeController : AsyncController
{
    public void CarsComplexAsync(string make)
    {
        AsyncManager.OutstandingOperations.Increment(2);

        System.Diagnostics.Debug.WriteLine("Enter CarsComplexAsync: " + DateTime.Now);

        Action getCarsAsync = () =>
        {
            List<Car> cars = CarService.GetCars(make);
            AsyncManager.Parameters["cars"] = cars;
            AsyncManager.OutstandingOperations.Decrement();    
        };


        Action getTrucksAsync = () =>
        {
            List<Car> trucks = CarService.GetTrucks(make);
            AsyncManager.Parameters["trucks"] = trucks;
            AsyncManager.OutstandingOperations.Decrement();
        };


        getCarsAsync.BeginInvoke(null, null);
        getTrucksAsync.BeginInvoke(null, null);
    }
public ActionResult CarsComplexCompleted(List<Car> cars, List<Car> trucks)
{
cars.AddRange(trucks);
return View(cars);
}
public static class CarService
{
    private static List<Car> _cars = new List<Car>
                {
                    new Car{ Make = "Ford", Model = "F-150", Color = "White", Year = 2010},
                    new Car{ Make = "Chevy", Model = "Camero", Color = "Black", Year = 1984},
                    new Car{ Make = "Peugeot", Model = "406 Coupe", Color = "White", Year = 2010},
                    new Car{ Make = "Dodge", Model = "Charger", Color = "Red", Year = 1974}
                };

    public static List<Car> GetCars(string model)
    {
        Thread.Sleep(5000);
        List<Car> cars = _cars;
        return cars;
    }

    public  static List<Car> GetTrucks(string make)
    {
        Thread.Sleep(5000);
        List<Car> cars = _cars;
        return cars;
    }
}

最佳答案

Is there a way to validate that I'm using I/O completion ports instead of ASP.NET Thread Pool?



不是没有看到您的代码,因为它取决于您使用的 API。

例如 HttpWebRequest.BeginGetResponse使用 I/O 完成端口。另一方面,如果您有一些 CPU 密集型任务正在手动创建的单独线程上运行,那么您没有使用 I/O 完成端口。

Is there a property in Thread.CurrentThread or someplace else that I can check to identify where the thread is running?



完成端口意味着没有线程,因为如果有线程,就好像您在线程上运行一样。 I/O 完成端口的工作方式基本上是启动一些 I/O 操作并注册一个 CP,然后释放所有线程并返回。在操作执行期间,您的应用程序中没有与之关联的线程。一旦操作完成,端口就会发出信号,并且从池中创建/抽取一个线程以结束请求。

关于asp.net-mvc - 如何判断 MVC AsyncController 线程是否在 ASP.NET 池或 I/O 完成端口中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616883/

相关文章:

c# - 让存储在 Session 中的数据保持事件状态

C# 锁线程问题

php - MVC 中的依赖注入(inject)

model-view-controller - ErroCS1929 'IHtmlHelper<IPagedList<Book>>' 不包含 'PagedListPager' 的定义

c# - 判断NHibernate实体是否有级联记录

c# - 带有用于服务器端渲染的 Javascript View 引擎的 Asp.Net MVC - 服务器上的构建错误

c# - 在 MVC 正则表达式中允许一些(但不是全部)空白

multithreading - 使用 Julia 1.3.1 的多线程速度较慢

c# - 等待一段时间不阻塞主线程

python - 在 Django 中创建一个 View