相关疑难解决方法(0)

如何在ASP.NET Web服务中使用System.Threading.Timer

背景: 我有一个用C#编写的在Windows Server 2008上运行的.NET 4.0 Web服务。我想在每天运行一次代码的asp.net Web服务中运行一个计时器。我听说过一些限制(请参阅下文),但是我想问一下我打算做什么,以便克服一些限制并将代码保留在Web服务中,因为它不是关键任务代码。但是,崩溃是不可接受的。注意:我不是,也不能使用WCF。

计划:

  • System.Threading.Timer在我的Web服务的构造函数中声明和实例化(在注释掉的行旁边:) //InitializeComponent();
  • 每30分钟启动一次火灾计时器。
  • 注意:因为我正在使用,System.Threading.Timer所以不必按照下面的msdn Tip#6运行保持活动代码。
  • 如果当前时间在我的数据库值(运行代码所需的时间)的30分钟以内,则运行代码。

问题:

  • 我想知道System.Threading.Timer使用上述计划在asp.net c#代码中使用的可靠性如何,如果它可以正确运行,那么可以说超过97%的时间?
  • 回收应用程序池和重新启动IIS服务器时,此计划是否有效?

似乎在Web服务中使用计时器存在以下问题:

  • 应用程序池回收
  • 线程快死了
  • 长期没有人上网
  • 时间记忆问题(最好使用Windows服务)

参考文献:

ASP.NET网站-在特定时间触发一些代码

网站上的计时器,每小时激活一次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应用程序传入请求的情况下执行代码,这是后台处理的理想情况。您也可以在此后台过程中进行索引或发送电子邮件等工作。”

c# asp.net service timer web

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

在ASP.NET中使用.NET 4.0任务

System.Threading.Task在IIS下托管的ASP.NET中使用新的Task API是否有任何警告或缺点?

我知道在.NET 4.0之前,始终建议避免使用IIS内部的任何ThreadPool操作.

asp.net iis multithreading .net-4.0 task

3
推荐指数
1
解决办法
936
查看次数

异常日志记录中的空引用异常屏蔽了真正的错误

我们有一个由网络请求启动的长期运行的流程。为了让进程有时间完成,我们将其分离到一个新线程上,并使用互斥体来确保该进程只有一个实例可以运行。此代码在我们的开发和暂存环境中按预期运行,但在我们的生产环境中失败并出现空引用异常。我们的应用程序日志记录没有捕获任何内容,我们的操作人员报告说它导致了应用程序池崩溃。(这似乎是一个环境问题,但我们必须假设环境配置相同。)到目前为止,我们无法确定空引用在哪里。

以下是应用程序事件日志中的异常:

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)

c# asp.net iis-7 multithreading mutex

3
推荐指数
1
解决办法
2163
查看次数

asp.net上的多线程

我没有为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)

c# asp.net multithreading

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

在c#中将线程暂停一段固定的时间间隔

这是我的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(),因为它可能会冻结主要的.

.net c# asp.net multithreading

0
推荐指数
1
解决办法
345
查看次数

标签 统计

asp.net ×5

c# ×4

multithreading ×4

.net ×1

.net-4.0 ×1

iis ×1

iis-7 ×1

mutex ×1

service ×1

task ×1

timer ×1

web ×1