小编Geo*_*ica的帖子

深入理解ASP.NET MVC上的async/await

当我在MVC控制器上进行异步操作时,尤其是在处理I/O操作时,我并不完全理解幕后发生了什么.假设我有一个上传动作:

public async Task<ActionResult> Upload (HttpPostedFileBase file) {
  ....
  await ReadFile(file);

  ...
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这些是发生的基本步骤:

  1. 从线程池中查看新线程并分配给处理命令请求.

  2. 当await被命中时,如果调用是I/O操作,则原始线程返回池中,控制转移到所谓的IOCP(输入输出完成端口).我不明白为什么请求仍然存在并等待答案,因为最终调用客户端将等待我们的请求完成.

我的问题是:谁/何时/如何等待完全阻止?

注意:我看到博客文章没有线程,它对GUI应用程序有意义,但对于这个服务器端场景我不明白.真.

c# asp.net-mvc multithreading asynchronous async-await

36
推荐指数
3
解决办法
2万
查看次数

城堡windsor决议管道与Unity作为子解析器

简而言之,我试图将Castle Windsor容器与Unity容器联系起来.让我解释一下背景:

我有一个项目,很长一段时间它使用城堡windsor.几天前,我得到了一些我必须从我的旧项目中消耗/使用的dll.这些DLL使用Unity Container作为其注入机制.我也可以访问这些dll中的接口/实现,但我不会尝试实例化手动实现,但我更愿意,如果可能的话,将Unity容器与我当前的城堡windsor容器相关联.我怎么能实现这个目标?

所以,如果我有:

public class MyService: IService 
{
    public MyService (IThidPartyService thirdParty) 
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

如果我IService和windsor IThirdPartyService一起解决,那么另一个容器要解决它会很好:Unity.

谢谢!.

c# castle-windsor ioc-container unity-container

7
推荐指数
1
解决办法
532
查看次数

缓存域模型数据

接下来我发现了一个问题,一开始并没有出现如此可疑的问题.首先让我描述一下环境的大局:

我有一个关于表模块体系结构的域模型,它使用了使用Entity Framework 6.x编写的数据访问层.我的应用程序是一个Windows窗体应用程序,域模型和数据访问层都在客户端上运行,我使用的是.NET 4.0(幸运的是,EF 6仍然与.NET 4.0兼容)

我的目标:创建一个常用于组合框/查找的commmon命名符缓存.我们的用户将根据需要刷新此缓存(每个控件右侧都有一个按钮,提供可以刷新缓存的命名符).

到现在为止还挺好.我已经开始编写这个缓存了.简而言之,我的缓存由一组TableCaches <T>实例组成,每个实例都能够从内存或数据库中获取List(如果已经更改了某些内容).

接下来,假设您有这样的业务:

public class PersonsModule
{
    public List<Person> GetAllByCityId(int cityId)
    {
        using (var ctx = new Container())
        {
            return (from p in ctx.Persons
                join addr in ctx.Addresses
                    on p.AddressId equals addr.Id
                where addr.CityId == cityId
                select p
                ).ToList();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,一个ideea开始成长:如果我可以做一个技巧,以便我的"容器"有时会提供虚假的集合,在我的缓存中找到的集合怎么办?但在这里我发现了最大的问题:.NET编译器在编译时做了一些棘手的事情:它检查你的集合是否是IQueriable <OfSomething>.如果为true,它会在IL代码调用内部烧掉处理表达式树的扩展方法,就像调用一样,否则它将简单地调用LINQ to Objects扩展方法.我也试过(仅用于研究目的)这个:

public class Determinator<TCollectionTypePersons, TCollectionTypeAddresses> 
    where TCollectionTypePersons : IEnumerable<Person>
    where TCollectionTypeAddresses : IEnumerable<Address>
{

    public List<Person> GetInternal(TCollectionTypePersons persons, TCollectionTypeAddresses addresses, int cityId)
    {
        return (from p …
Run Code Online (Sandbox Code Playgroud)

c# linq caching entity-framework

6
推荐指数
1
解决办法
234
查看次数

.Net AsyncStateMachine自定义实现行为

我实现了一个自定义异步方法构建器,但我有几个问题,我无法找到正确的答案.

1)我看到这取决于我如何构建(调试/发布),状态机被编译成结构或类.是否有可能指示编译器始终生成一个类,无论如何?

2)我看到void SetStateMachine(IAsyncStateMachine m)根本没有被调用,即使在文档中说,如果状态机是一个结构,它应该被调用它的盒装版本.

3)我让我的方法构建器成为一个类.我应该把它变成一个结构吗?这是什么最好的做法?

4)奇怪的是,GetAwaiter有时在调用builder.SetResult方法后调用.这是正常行为吗?如果我们检查任务的反编译版本,我们可以清楚地看到它首先请求awaiter,如果awaiter没有完成,它会调用机器状态AwaitOnCompleted/AwaitUnsafeOnCompleted.

环境:.Net Core 2.1

非常感谢!

c# state-machine async-await .net-core

6
推荐指数
1
解决办法
146
查看次数