Как определить, выполняется ли поток MVC AsyncController в ASP.NET Pool или в порту завершения ввода / вывода - PullRequest
6 голосов
/ 11 апреля 2011

У меня есть приложение ASP.NET MVC 3.Я использую AsyncController и создаю новые темы.Есть ли способ проверить, что я использую порты завершения ввода / вывода вместо пула потоков 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;
    }
}

1 Ответ

8 голосов
/ 11 апреля 2011

Есть ли способ проверить, что я использую порты завершения ввода-вывода вместо пула потоков ASP.NET?

Не без просмотра вашего кода, поскольку это будет зависеть от используемых вами API.

Например, HttpWebRequest.BeginGetResponse использует порты завершения ввода / вывода. С другой стороны, если у вас есть какая-то ресурсоемкая задача, выполняемая в отдельном потоке, который вы создали вручную, то вы не используете порты завершения ввода / вывода.

Есть ли свойство в Thread.CurrentThread или в каком-либо другом месте, которое я могу проверить, чтобы определить, где выполняется поток?

Порт завершения означает, что нет потока, потому что если был поток, то он, как если бы вы работали в потоке. По сути, порты завершения ввода / вывода работают так, что вы запускаете какую-то операцию ввода-вывода, и CP регистрируется в ней, затем вы освобождаете все потоки и возвращаетесь. Во время выполнения операции в вашем приложении нет связанных потоков. Как только операция завершается, порт сигнализируется и поток завершается / извлекается из пула для завершения запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...