gpt4 book ai didi

c# - IIS 中创建的线程能否通知其超时?

转载 作者:行者123 更新时间:2023-11-30 18:30:57 25 4
gpt4 key购买 nike

我们在 Web 应用程序中有一个长时间运行的进程。该进程在使用此创建的单独线程上运行:

var arguments = new object[] { startDate, endDate,  m_token };
ThreadPool.QueueUserWorkItem((WaitCallback)xyzmethod, arguments);

由于 IIS 对无人值守线程可以运行多长时间的限制,线程正在终止。它因 session 超时或应用程序回收而终止。

我想知道一个线程是否可以通知它即将超时。或者在终止之前发送通知?

最佳答案

我创建了一个至少适用于 WebDevServer 的帮助程序类,我认为它也适用于 IIS。这是做什么的Register hostingenvironment 的助手当主机被很好地关闭时,它最终调用 Stop 。请记住,在不受控制的进程退出的情况下,不会再运行任何线程,因此也不会调用此方法。

用法

    protected void Button1_Click(object sender, EventArgs e)
{
var hlp = Myhelper.Create();
var arguments = new object[] { "foo", 42 };
ThreadPool.QueueUserWorkItem(hlp.FooBar, arguments);
}

助手

public class Myhelper:IRegisteredObject
{
private Myhelper(){}

// factory
public static Myhelper Create()
{
var hlp = new Myhelper();
HostingEnvironment.RegisterObject(hlp); // register ourself!
return hlp;
}

bool keepRunning = true;
ManualResetEvent mre = new ManualResetEvent(false);
ManualResetEvent stopped = new ManualResetEvent(false);

// our DoWork method!
public void FooBar(object args)
{
EventLog.WriteEntry(".NET Runtime", "started");
// implement your long running function,
// be sure to check regularly if you need to stop processing
while (keepRunning)
{
Trace.Write("+");
mre.WaitOne(1000); // do work, (used this instead of Thread.Sleep())
}
EventLog.WriteEntry(".NET Runtime","stopped");
HostingEnvironment.UnregisterObject(this);
stopped.Set(); // we are done!
}

// this gets caled when the HostingEnvironment is stopping
public void Stop(bool immediate)
{
keepRunning = false;
mre.Set(); // signal nicely
stopped.WaitOne(200); // wait max 200 ms before returning to prevent getting stuck
}
}

关于c# - IIS 中创建的线程能否通知其超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20838539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com