如何在不影响性能的情况下正确使用火灾和忘记?

时间:2016-05-23 10:27:35

标签: c# .net azure azure-storage-queues fire-and-forget

我已经问了这个问题,但是没有得到太多的回应,我得到的并没有解决我的问题。所以我在这里尝试以不同的方式再次提问。

我有一个项目将产品Feed文件处理到我的系统中。对于一个特定的饲料文件,整个过程大约需要40-50分钟。现在我创建了一个WebJob来处理来自Feed的图片,并通过创建存储客户端将我的第一个项目中的图片网址发送到WebJob。当我将其添加到我的项目中时,它显着增加了处理时间,因此我尝试将其与Task.Run一起使用Fire and Forget方法,但即使现在整个处理时间大约为2小时。

以下是我调用创建存储队列的方法的方法。

if (insertImages)
{
    #pragma warning disable 4014
    Task.Run(async () => { await new QueueUtility().CreateQueueMessage(picture); }).ConfigureAwait(false);
    #pragma warning restore 4014
}

这是我创建队列消息的代码

public async Task CreateQueueMessage(Picture picture)
    {
            Utility.Log log = new Utility.Log();
            await AddQueueMessage(picture.url);

    }


public async Task AddQueueMessage(string queueMessage)
    {
        ServicePointManager.UseNagleAlgorithm = false;

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("ImagekWebJobStorage"));

        // Create the queue client.
        CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

        // Retrieve a reference to a container.
        CloudQueue queue = queueClient.GetQueueReference("imagequeue");

        // Create a message and add it to the queue.
        CloudQueueMessage message = new CloudQueueMessage(queueMessage);
        queue.AddMessage(message);

    }

我不明白为什么我的处理时间加倍,也无法找到解决方法。任何有助于我解决这个问题的想法都会非常有用。

编辑: 将QueueUtility转换为静态类,将方法转换为静态方法似乎有所帮助。不知道如何或为什么。

1 个答案:

答案 0 :(得分:1)

为发送的每封邮件创建新的CloudStorageAccount,CloudQueueClient和CloudQueue效率非常低。

您应该创建一次并重复使用它们发送每条消息。

有关优化使用Azure存储的应用程序性能的更多指导,请参阅:

Microsoft Azure存储性能和可伸缩性核对表 https://azure.microsoft.com/en-us/documentation/articles/storage-performance-checklist/