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

Asp.net mvc 如何判断MVC AsyncController线程是在ASP.NET池中执行还是在I/O完成端口中执行,asp.net-mvc,multithreading,model-view-controller,asp.net-mvc-3,asynchronous,Asp.net Mvc,Multithreading,Model View Controller,Asp.net Mvc 3,Asynchronous,我有一个ASP.NETMVC3应用程序。我正在使用AsyncController并创建新线程。是否有方法验证我使用的是I/O完成端口而不是ASP.NET线程池 Thread.CurrentThread或其他地方是否有我可以检查以确定线程运行位置的属性 这里是我正在执行的代码的示例 public class HomeController : AsyncController { public void CarsComplexAsync(string make) { A

我有一个ASP.NETMVC3应用程序。我正在使用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);
    }
公共类HomeController:AsyncController
{
公共作废CarsComplexAsync(字符串生成)
{
AsyncManager.OutstandingOperations.Increment(2);
System.Diagnostics.Debug.WriteLine(“输入CarsComplexAsync:+DateTime.Now”);
操作getCarsAsync=()=>
{
List cars=CarService.GetCars(make);
AsyncManager.Parameters[“cars”]=cars;
AsyncManager.OutstandingOperations.Decrement();
};
操作getTruckAsync=()=>
{
列出卡车=CarService.GetTrucks(make);
AsyncManager.Parameters[“trucks”]=卡车;
AsyncManager.OutstandingOperations.Decrement();
};
getCarsAsync.BeginInvoke(null,null);
getTruckAsync.BeginInvoke(null,null);
}

公共行动结果车辆已完成(列出车辆、卡车)
{
汽车.增程(卡车);
返回视图(汽车);
}

公共静态类CarService
{
私人静态列表_车=新列表
{
新车{Make=“Ford”,Model=“F-150”,Color=“White”,年份=2010},
新车{Make=“Chevy”,Model=“Camero”,Color=“Black”,年份=1984},
新车{Make=“Peugeot”,Model=“406 Coupe”,Color=“White”,年份=2010},
新车{Make=“Dodge”,Model=“Charger”,Color=“Red”,年份=1974}
};
公共静态列表GetCars(字符串模型)
{
睡眠(5000);
列出汽车=_汽车;
返回车辆;
}
公共静态列表GetTrucks(字符串生成)
{
睡眠(5000);
列出汽车=_汽车;
返回车辆;
}
}
是否有方法验证我使用的是I/O完成端口而不是ASP.NET线程池

如果没有看到您的代码,它将取决于您使用的API

例如,使用I/O完成端口。另一方面,如果您在手动创建的单独线程上运行一些CPU密集型任务,则不使用I/O完成端口

Thread.CurrentThread或其他地方是否有我可以检查以确定线程运行位置的属性


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

我可能应该添加一辆法国制造的汽车。@BarDev,现在您已经展示了您的示例,它不涉及任何I/O完成端口。操作是在池中的一个线程上执行的,该线程是在执行过程中被垄断。下面是一个AsyncController的示例,它调用远程web服务并使用I/O完成端口。IOCP通常用于处理远程系统,例如web服务调用、数据库调用,甚至使用Stream.BeginRead、…@Darin的文件I/O,谢谢你的回答。我不想更改ser中的任何代码vice使我的应用程序使用I/O完成端口。我希望我可以更改操作,所有操作都可以使用I/O完成端口。是时候更改POC并重试了。@Darin,我想我已经解决了我的问题,不知道您是否可以确认。首先,我在我的服务中添加了以下代码
Debug.WriteLine(“IsThreadPoolThread:”+Thread.CurrentThread.IsThreadPoolThread);
。当我在当前实现中运行此函数时,我得到了true。但是如果我将
操作GetCarsSync=()=>
更改为
线程调用GetCars=新线程()=>
并在线程上调用Start,我得到false。@BarDev,在第一种情况下,您正在使用线程池中的线程,因为您正在对创建的操作委托调用
BeginInvoke
方法。在第二种情况下,您得到false,因为您正在手动生成新线程(
new thread()
).但在这两种情况下,您都没有使用IOCP=>您使用的是一个线程,在第一种情况下,该线程是从池中提取的,在第二种情况下,该线程是手动创建的。
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;
    }
}