c# – Azure Web角色中的后台线程
可以通过WebRole.cs OnStart()方法运行一个线程,以便我们能够通过aspx页面访问它来执行后台工作吗?
我知道正确的方法是使用工作者角色,但我希望尽可能降低运行成本. 我的想法是创建一个始终在运行并等待作业的线程,例如,如果我想进行阻塞操作,如发送电子邮件,我会使用提供SendEmail方法的线程,是否可以这样做?如果是这样,你能否提供一些可以指引我正确方向的例子? 解决方法
我想建议一个与Leon和David的解决方案不同的解决方案:
>大卫的解决方案没问题,但没有弹性.实例/进程在处理任务时脱机的是什么? 您应该看到的另一个选项是在此方案中使用Windows Azure存储队列(它们非常便宜): >您的Web应用程序:将消息发送到队列(例如“发送电子邮件到someone@someone.com”) 该解决方案具有许多优点. WebRole.cs在与Web应用程序不同的进程中运行,因此对请求线程没有影响.除此之外,如果由于某种原因发送邮件失败,邮件将保留在队列中并在下次处理.如果应用程序或进程崩溃,这将确保您不会丢失任何要执行的任务. 这是一个让你入门的例子.请注意,如果您希望生成就绪,则需要改进此代码(重试策略,异常处理,退避轮询,…): using System; using System.Collections.Generic; using System.Linq; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.Diagnostics; using Microsoft.WindowsAzure.ServiceRuntime; using Microsoft.WindowsAzure.StorageClient; using System.Threading.Tasks; namespace MvcWebRole1 { public class WebRole : RoleEntryPoint { public override bool OnStart() { Task.Factory.StartNew(InitializeQueueListener); return base.OnStart(); } private void InitializeQueueListener() { Microsoft.WindowsAzure.CloudStorageAccount.SetConfigurationSettingPublisher((configName,configSetter) => { configSetter(Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue(configName)); }); var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString"); var queueStorage = storageAccount.CreateCloudQueueClient(); var queue = queueStorage.GetQueueReference("myqueue"); queue.CreateIfNotExist(); while (true) { CloudQueueMessage msg = queue.GetMessage(); if (msg != null) { // DO SOMETHING HERE queue.DeleteMessage(msg); } else { System.Threading.Thread.Sleep(1000); } } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 使用递归从IDictionary中删除项目
- Oracle中的case when then else end
- ruby-on-rails – 使用RSPEC进行测试时突然出现无
- [Swift Weekly Contest 116]LeetCode964. 表示数
- c# – .NET的JavaScriptSerializer.Deserialize(
- ruby – “无法将符号转换为整数”奇怪的错误
- Oracle搜索带有非英文字符的文本
- postgresql – OFFSET与ROW_NUMBER()
- ruby-on-rails – 用Prawn生成的PDF中右侧缩进的
- cocos2d-x 3.X用progressTimer制作血槽