小编Fab*_*abe的帖子

Task.Run是否被认为是ASP .NET MVC Web应用程序中的不良做法?

背景

我们目前正在开发一个Web应用程序,它依赖于ASP .NET MVC 5,Angular.JS 1.4,Web API 2和Entity Framework 6.出于可伸缩性的原因,Web应用程序的重量依赖于async/await模式.我们的域需要一些cpu密集型计算,这可能需要几秒钟(<10s).在过去,一些团队成员使用Task.Run,​​以加快计算速度.因为在ASP .NET MVC或Web API控制器中启动一个额外的线程被认为是一种不好的做法(该线程不为IIS所知,所以不是在AppDomain Recycle上考虑=>参见Stephen Cleary的博客文章),他们使用了ConfigureAwait(false).

public async Task CalculateAsync(double param1, double param2)
{
    // CalculateSync is synchronous and cpu-intensive (<10s)
    await Task.Run(() => this.CalculateSync(param1, param2))).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

问题

  • 在异步Web API控制器中使用Task.Run进行cpu绑定操作是否有任何性能优势?
  • ConfigureAwait(false)是否真的避免创建额外的线程?

c# asp.net asp.net-mvc task-parallel-library async-await

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

如何实现异步File.Delete/Create/Move?

由于我必须在我的应用程序中执行大量文件I/O操作,因此我决定异步实现它们.查看MSDN,File.Create,File.Delete和File.Move没有异步对应项.据我所知,原因是不存在用于文件删除,创建或移动的异步Win32实现,所以我最终得到了以下解决方案:

public static Task DeleteAsync(string path)
{
     Guard.FileExists(path);

     return Task.Run(() => File.Delete(path));
}

public static Task<FileStream> CreateAsync(string path)
{
     Guard.IsNotNullOrWhitespace(path);

     return Task.Run(() => File.Create(path));
}

public static Task MoveAsync(string sourceFileName, string destFileName)
{
     Guard.FileExists(sourceFileName);
     Guard.IsNotNullOrWhitespace(destFileName);

     return Task.Run(() => { File.Move(sourceFileName, destFileName); });
}
Run Code Online (Sandbox Code Playgroud)

考虑到范例"不要在库中使用Task.Run",我想知道是否有更好的实现或者我应该回退到同步代码?

提前谢谢了!

编辑:


  • 根据Peter Duniho的建议改进了代码
  • 添加了由Sriram Sakthivel提供的原始博客文章的链接

c# io asynchronous task-parallel-library async-await

13
推荐指数
1
解决办法
1万
查看次数

Tomcat为每个请求创建一个新会话

我现在正在解决这个问题2天,我希望这里的任何人都有类似的问题和解决方案.

问题:它是一个Spring MVC(2.5.6.)Web应用程序,它在Tomcat 6中运行.当请求起始页面时,它将客户重定向到JSP页面(通过使用HTML的元刷新标签),它将内容加载到很多Ajax请求(Framework:Prototype).问题是Tomcat为每个AJAX请求创建一个新会话(大约67个会话).我的第一个想法是在加载起始页面之后存储会话Cookie,并且Ajax请求强制Tomcat创建新会话.我的方法是手工创建会话cookie,但这没有任何区别.有趣的是,它可以在其他一些tomcat实例中运行,但不适用于集成测试所需的环境.在我看来,这是一个Tomcat配置问题.

在使用Firebug进一步调查之后,我发现Tomcat为每个请求创建了一个新的Session,即使正确的JSESSIONID被转移到它(50B5EA0BCFE811C744CE9C1F9EDE0097):

Request Header 1: 
Cookie JSESSIONID=F3206CBF2C961E125821FF22FA31A02D

Response Header 1:
Set-Cookie JSESSIONID=49E000B4D6880F4F94531AB9C78DB667; Path=/JOCA-Music-Portal   JSESSIONID=50B5EA0BCFE811C744CE9C1F9EDE0097; Path=/JOCA-Music-Portal

Request Header 2:
Cookie JSESSIONID=50B5EA0BCFE811C744CE9C1F9EDE0097

Response Header 2:
Set-Cookie JSESSIONID=DCCA2D1B98D11223A6B8855800276E27; Path=/JOCA-Music-Portal
Run Code Online (Sandbox Code Playgroud)

更新:进一步调查将问题隔离到Tomcat领域配置.我们使用JDBC Realm进行登录.当登录被取消激活时,只创建一个会话.如果它被激活,Tomcat会创建无效/过期的会话,这就是为每个请求创建一个新会话的原因.但为什么Tomcat表现得像这样呢?

我真的很绝望,所以任何想法/提示/解决方案都很受欢迎.

非常感谢你

ajax model-view-controller session spring tomcat

8
推荐指数
1
解决办法
1万
查看次数

Tomcat:在数据库中存储会话

我正在寻找一种避免内存会话复制/群集的方法,并将会话存储在数据库中.此时使用Tomcat的JDBCStore是无用的,因为它只在数据库中存储非活动会话以保存服务器内存.有什么建议?

非常感谢Fabian

java replication tomcat servlets jdbc

8
推荐指数
1
解决办法
2万
查看次数

如何使用客户端证书保护OWIN自主WebAPI?

背景

我们目前正在使用Web API 2和.NET 4.5.2构建RESTful服务.该服务利用OWIN自托管,使用Topshelf嵌入在Windows服务中.为了进行身份验证,客户端必须提供客户端证书(X509).到目前为止我们找到的所有文档都使用IIS来设置客户端证书身份验证

在使用OWIN自托管而不是IIS时,是否有通过证书进行身份验证的正确方法?

提前谢谢了.

c# client-certificates asp.net-web-api owin asp.net-web-api2

6
推荐指数
0
解决办法
1128
查看次数