Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步Azure函数中捕捉异常的位置_C#_Azure_Asynchronous_Exception Handling_Azure Functions - Fatal编程技术网

C# 异步Azure函数中捕捉异常的位置

C# 异步Azure函数中捕捉异常的位置,c#,azure,asynchronous,exception-handling,azure-functions,C#,Azure,Asynchronous,Exception Handling,Azure Functions,我已经设置了一个Azure函数,我希望它异步运行,因为我希望队列中有数百条/数千条/更多的消息,这些消息都会同时退出队列,所以我在下面实现了它(也许有更好的方法)。或者我需要担心异步运行函数中的代码吗 如果队列中的数千条消息同时全部出列,Azure会同时处理数千个这样的函数吗?这个Azure函数表示一次只能运行几百个 哪里是放置try-catch语句的最佳位置?在我的逻辑周围的异步调用内部还是像我的代码一样的异步调用外部?或者这有关系吗 public static class CancelEve

我已经设置了一个Azure函数,我希望它异步运行,因为我希望队列中有数百条/数千条/更多的消息,这些消息都会同时退出队列,所以我在下面实现了它(也许有更好的方法)。或者我需要担心异步运行函数中的代码吗

如果队列中的数千条消息同时全部出列,Azure会同时处理数千个这样的函数吗?这个Azure函数表示一次只能运行几百个

哪里是放置try-catch语句的最佳位置?在我的逻辑周围的异步调用内部还是像我的代码一样的异步调用外部?或者这有关系吗

public static class CancelEvent
{
    [FunctionName("CancelEvent")] 
    public static async void RunAsync([ServiceBusTrigger("canceleventqueue", AccessRights.Manage, Connection = "service_bus_key")]string myQueueItem, TraceWriter log, ExecutionContext context)
    {
        try
        {
            await Task.Run(() => Processor.ProcessAsync());
        }
        catch(Exception ex)
        {
        }
     }
}

public class Processor
{
    public static void ProcessAsync()
    {
        // do the work
    }
}

添加
wait Task.Run
调用同步方法没有多大意义。努力使
ProcessAsync
真正异步(返回
Task
和非阻塞)

因此,更好的选择(请注意,这两种方法都返回
Task
):

更糟糕的选择也是可行的:

[FunctionName("CancelEvent")] 
public static void RunAsync([ServiceBusTrigger("canceleventqueue", AccessRights.Manage, Connection = "service_bus_key")]string myQueueItem, TraceWriter log, ExecutionContext context)
{
    try
    {
        Processor.Process();
    }
    catch (Exception ex)
    {
        // Try catch will work fine 
    }
}

public class Processor
{
    public static void Process()
    {
        // do the work
    }
}
Azure将在这两种情况下并行运行多个执行。只是第一种选择将在资源使用方面更加精简


并非所有消息都将一次处理,但Azure将根据一些内部缩放逻辑缩放并行执行的数量。

TLDR;不要将Azure函数构建为异步的

在我最近使用azure函数的经验中,我发现最好不要将函数构建为异步函数

在我的情况下,我使用ServiceBustigger接收消息,然后等待处理方法,并困惑于当冒泡出异常时,它不会在azure门户中显示为失败,也不会捕获Application Insights帐户中的异常详细信息,它也不会适当地放弃或断送这一信息。我只能通过转到存储帐户中的files\eventlog.xml部分来发现异常详细信息,在那里我会发现一个关于未处理的异常导致函数崩溃的投诉

在花了一天的时间亲自做一个完整的try/catch并处理message.adverd()和message.Deadletter()逻辑以及手动记录所有AppInsights遥测之后,我发现根本不做异步并冒泡出异常(在第一次执行错误报告或处理逻辑之后)导致了我在平台上预期的所有行为

门户中函数的“运行历史记录”正确显示了已通过和失败的执行,并捕获了所有异常详细信息


这是一个警告故事,让你的Azure功能保持静态、同步和简单。其设计的消息处理本质应该已经足够异步。

Hi Mikhail。甚至有必要使这个函数或它调用的任何方法异步吗?我只是调用一个数据库行,获取一个值并发送一封电子邮件,在方法“Process()”中没有真正长时间运行的逻辑。通过在函数或“Process()”方法的I/O操作(如数据库调用)中保留异步调用和发送电子邮件,我会获得任何速度优势吗。但您不必这样做。在Processor类中将“async”添加到方法“ProcessAsync()”时,我遇到了一个问题。当我添加“async”时,我得到一条intellisnse绿线,上面写着“async方法缺少wait并将同步运行”,它希望我将所有内容都设置为非异步。我将发布我所有的代码并在上面编辑是的,只是添加关键字没有帮助,它必须是异步的。异步需要一点学习,恐怕我无法在SO注释中解释所有细节。。。
[FunctionName("CancelEvent")] 
public static void RunAsync([ServiceBusTrigger("canceleventqueue", AccessRights.Manage, Connection = "service_bus_key")]string myQueueItem, TraceWriter log, ExecutionContext context)
{
    try
    {
        Processor.Process();
    }
    catch (Exception ex)
    {
        // Try catch will work fine 
    }
}

public class Processor
{
    public static void Process()
    {
        // do the work
    }
}