【问题标题】:How to tell if MVC AsyncController Thread is execution in ASP.NET Pool or I/O Completion Port如何判断 MVC AsyncController 线程是否在 ASP.NET 池或 I/O 完成端口中执行
【发布时间】:2011-08-02 18:41:51
【问题描述】:

我有一个 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;
    }
}

【问题讨论】:

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


    【解决方案1】:

    有没有办法验证我使用的是 I/O 完成端口而不是 ASP.NET 线程池?

    必须看到您的代码,因为它取决于您使用的 API。

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

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

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

    【讨论】:

    • 我可能应该添加一辆法国制造的汽车。
    • @BarDev,现在您已经展示了您的示例,它不涉及任何 I/O 完成端口。这些操作在池中的线​​程上执行,该线程在执行期间被垄断。这是调用远程 Web 服务并使用 I/O 完成端口的 AsyncController 的an example。 IOCP 常用于处理远程系统,例如 Web 服务调用、数据库调用,甚至使用 Stream.BeginRead 进行文件 I/O,...
    • @Darin,感谢您的回答。我不想更改服务中的任何代码以使我的应用程序使用 I/O 完成端口。我希望我可以改变动作,一切都可以使用 I/O 完成端口。是时候更改 POC 并重试了。
    • @Darin,我想我发现了我的问题,想知道你是否可以确认一下。首先,我将以下代码添加到我的服务Debug.WriteLine("IsThreadPoolThread:" + Thread.CurrentThread.IsThreadPoolThread);。当我在当前的实现中运行它时,我得到了真实的结果。但是,如果我将 Action getCarsAsync = () =&gt; 更改为 Thread callGetCars = new Thread(() =&gt; 并在线程上调用 Start,我会得到错误。
    • @BarDev,在第一种情况下,您正在使用线程池中的线程,因为您在创建的 Action 委托上调用 BeginInvoke 方法。在第二种情况下,您会得到错误,因为您手动生成了一个新线程 (new Thread())。但在这两种情况下,您都不使用 IOCP =>您使用的线程在第一种情况下是从池中提取的,而在第二种情况下是手动创建的。
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 2020-01-23
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2023-03-26
    • 2011-02-21
    相关资源
    最近更新 更多