背景: 我有一个用C#编写的在Windows Server 2008上运行的.NET 4.0 Web服务。我想在每天运行一次代码的asp.net Web服务中运行一个计时器。我听说过一些限制(请参阅下文),但是我想问一下我打算做什么,以便克服一些限制并将代码保留在Web服务中,因为它不是关键任务代码。但是,崩溃是不可接受的。注意:我不是,也不能使用WCF。
计划:
System.Threading.Timer
在我的Web服务的构造函数中声明和实例化(在注释掉的行旁边:)
//InitializeComponent();
。System.Threading.Timer
所以不必按照下面的msdn Tip#6运行保持活动代码。问题:
System.Threading.Timer
使用上述计划在asp.net c#代码中使用的可靠性如何,如果它可以正确运行,那么可以说超过97%的时间?似乎在Web服务中使用计时器存在以下问题:
参考文献:
http://forums.asp.net/t/1079158.aspx/1
http://msdn.microsoft.com/zh-cn/magazine/cc163854.aspx (请参阅提示6)
在技巧6中, “ System.Threading命名空间中的Timer类是一个非常有用的工具,但是在.NET Framework中它鲜为人知,至少对于Web开发人员而言是这样。创建后,Timer将以可配置的时间间隔从ThreadPool调用线程上的指定回调。这意味着您可以设置代码以在不向ASP.NET应用程序传入请求的情况下执行代码,这是后台处理的理想情况。您也可以在此后台过程中进行索引或发送电子邮件等工作。”
System.Threading.Task
在IIS下托管的ASP.NET中使用新的Task API是否有任何警告或缺点?
我知道在.NET 4.0之前,始终建议避免使用IIS内部的任何ThreadPool操作.
我们有一个由网络请求启动的长期运行的流程。为了让进程有时间完成,我们将其分离到一个新线程上,并使用互斥体来确保该进程只有一个实例可以运行。此代码在我们的开发和暂存环境中按预期运行,但在我们的生产环境中失败并出现空引用异常。我们的应用程序日志记录没有捕获任何内容,我们的操作人员报告说它导致了应用程序池崩溃。(这似乎是一个环境问题,但我们必须假设环境配置相同。)到目前为止,我们无法确定空引用在哪里。
以下是应用程序事件日志中的异常:
Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
StackTrace: at Jobs.LongRunningJob.DoWork()
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Run Code Online (Sandbox Code Playgroud)
这是代码(稍微清理过):
public class LongRunningJob: Job
{
private static Mutex mutex = new Mutex();
protected override void PerformRunJob()
{
var ts = new ThreadStart(LongRunningJob.DoWork);
var thd = new Thread(ts);
thd.IsBackground = true;
thd.Start();
}
private …
Run Code Online (Sandbox Code Playgroud) 我没有为asp.net使用多线程.我有一个Web应用程序将大型临时文件上传到文件夹.我想带上那个临时文件,并在上传后用它做一些其他的事情.我是否可以在另一个线程上完成此工作,而用户不再在网站上?感谢您的任何帮助或建议.
1.User发布大文件2.上传temp到服务器3.上传完成后.我想运行另一个线程/工作程序,它可以在没有任何用户迭代的情况下运行,但是由用户触发.
void uploading(){
//Uploading file To server
}
void Submitclick(){
Start a Thread
Thread thread = new Thread(DoThreadWork);// does the user still need to be logged in?
Send to another page
}
void DoThreadWork(){Do this in background}
Run Code Online (Sandbox Code Playgroud) 这是我的CS
protected void timer_Tick(object sender, EventArgs e)
{
lblNum.Text = string.Format("{0:dd:MM:yyyy hh:mm:ss}", DateTime.Now);
if (DateTime.Now.Second == 30)
{
Thread t = new Thread(DisplayImages);
t.Start();
//t.Suspend();
t.Join();
}
}
Run Code Online (Sandbox Code Playgroud)
我想等待线程t一段固定的时间间隔,让我的主线程保持不变.在那段时间之后,我想在线程中做一些事情.
我尝试了t.Sleep(),但没有用,因为Sleep()是静态的.
更新:
查看我现有的问题.这个问题就是其中的一部分.我的主线有一个我不想停止的自动收报机.所以我不能使用Thread.Sleep(),因为它可能会冻结主要的.