究竟有什么区别
Task.Run(() => {
LongRunningMethod();
});
Run Code Online (Sandbox Code Playgroud)
要么
HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod());
Run Code Online (Sandbox Code Playgroud)
我在Asp.Net MVC应用程序上进行了测试,在该应用程序中,我在使用Task.Run或QBWI调用的异步任务中继续在文本文件中写入一行约10分钟.
使用Task和QBWI都可以.我的异步方法一直写入该文件,直到10分钟没有任何问题.我没有观察到IIS对其回收的干扰.
那么QueueBackgroundWorkItem有什么特别之处呢?
我们有一个ASP.NET MVC 4应用程序,它链接到传统的本机代码.问题是这个遗留代码具有在启动时构建的全局静态代码,但由于本机代码对App Domains一无所知,因此在重新加载App Domain时不会重新初始化该代码.在重新启动应用程序池进程之前,这会导致我们的应用程序中出现不正确的行为或崩溃.
因此,我想强制应用程序池在我们的应用程序的App Domain被回收时进行回收.IIS中是否有这样的设置,或者是否正在卸载域时我可以在我的应用程序中调用代码?
关于我的设置的一些信息,
更新
根据下面的答案,我连接到AppDomain卸载事件,并使用类似于以下的代码来回收应用程序池.
try
{
// Find the worker process running us and from that our AppPool
int pid = Process.GetCurrentProcess().Id;
var manager = new ServerManager();
WorkerProcess process = (from p in manager.WorkerProcesses where p.ProcessId == pid select p).FirstOrDefault();
// From the name, find the AppPool and recycle it
if ( process != null )
{
ApplicationPool pool = (from p in manager.ApplicationPools where p.Name == process.AppPoolName …Run Code Online (Sandbox Code Playgroud) 有没有办法可以确定c#中的应用程序池(在IIS7中)已启动多长时间(自启动以来的时间,或上次重启)?
如何使用C#获取特定网站IIS 6程序的应用程序池名称
编辑:我已经使用了DirectoryServices命名空间的方法,但是除非使用相同的代码显式设置,否则无法正确检索应用程序池名称.这意味着如果您使用iis管理器手动添加网站并设置应用程序池,那么当我使用sharepoint创建应用程序并设置不同的appPool这些方法不起作用时,这些代码将无法工作(它将始终返回DefaultAppPool).
我有一个虚拟目录名称.对于这个虚拟目录,我必须找出相关的应用程序池.一旦我获得应用程序池,我必须找出此应用程序池中的所有虚拟目录..我使用此代码找出与虚拟目录关联的应用程序池
string AppPoolName = string.Empty;
ServerManager manager = new ServerManager();
foreach (Site site in manager.Sites)
{
foreach (Application app in site.Applications)
{
string path = app.Path;
path = path.Replace("/", " ");
path = path.Trim();
if (path.ToLower() == VDName.ToLower())
{
AppPoolName = app.ApplicationPoolName;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud) 基本上我想要在编辑web.config文件时会发生的效果.该应用程序基本上完全卸载并重新启动,从而重新启动Application_Start,并且还放弃由现已解散的AppDomain创建的任何动态创建的类型.
编辑
我需要在我的Web应用程序中的C#代码中执行此操作.我知道可以做到; 我很久以前就这么做了,但后来丢失了代码并忘记了我是怎么做到的.