Toi*_*las 6 c# multithreading azure azure-web-roles
可以通过WebRole.cs OnStart()方法运行一个线程,以便我们能够通过aspx页面访问它来执行后台工作吗?我知道正确的方法是使用工作者角色,但我希望尽可能降低运行成本.
我的想法是创建一个始终在运行并等待作业的线程,例如,如果我想进行阻塞操作,如发送电子邮件,我会使用提供SendEmail方法的线程,是否可以这样做?如果是这样,你能否提供一些可以指引我正确方向的例子?
San*_*tia 10
我想建议一个与Leon和David的解决方案不同的解决方案:
您应该看到的另一个选项是在此方案中使用Windows Azure存储队列(它们非常便宜):
该解决方案具有许多优点.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);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5810 次 |
| 最近记录: |