Azure WebJobs - 我可以使用异步方法吗?

Posted

技术标签:

【中文标题】Azure WebJobs - 我可以使用异步方法吗?【英文标题】:Azure WebJobs - Can I use Async Methods? 【发布时间】:2014-05-19 22:14:25 【问题描述】:

我想知道 Azure WebJobs SDK 是否可以触发异步方法?目前我有一个如下所示的方法:

class Program

    static void Main(string[] args)
    
        var host = new JobHost();
        host.RunAndBlock();
    

    public static void ProcessStuff([QueueInput("myqueue")] string msg)
    
        var tsk = ProcessStuffAsync(msg)
                  .ContinueWith(x => HandleAsyncError(x),
                      TaskContinuationOptions.OnlyOnFaulted);
        tsk.Wait();
    

    public static async Task ProcessStuffAsync(string msg)
    
        // do some async stuff and await it
    

    // other methods ...

但是,我想知道是否可以让 JobHost 知道调用我的异步方法?没有大量关于尝试在 WebJobs 中使用 async/await 的文档,如果可以的话,那就太好了。

我正在尝试在本地运行它来测试...但 WebJobs SDK 不支持本地存储模拟器...

2014 年 4 月 7 日更新:维克多的回答是正确的,但我确实想展示在 WebJob 中使用异步方法会看到什么(它们确实有效)。

对于您的 WebJob 中的方法,如下所示:

public async static Task ProcessMessageAsync([QueueInput("testq2")] string message)

    await Task.Delay(50);

    Console.WriteLine("Processing Message Async...");
    Console.WriteLine(message);

您将在 WebJobs 日志中看到以下输出:

running in pid: 6272
Timestamp:4:36:02 PM
Parameters bound. Invoking user function.
--------
Warning: This asynchronous method will be run synchronously.
Processing Message Async...
a test message
--------
Success

【问题讨论】:

你为什么不试试并告诉我们? @StephenCleary 目前正在处理它 - 如果其他人已经成功完成,只是想避免设置所有 azure 存储/网站帐户和配置。 How to do Async in Azure WebJob function的可能重复 【参考方案1】:

现在支持异步。请参阅博文here。

很遗憾,这两个问题的简短回答都是:不支持。

(稍微)更长的答案:

WebJobs SDK 不支持异步方法。如果您查看执行日志(在仪表板上),您会看到一条警告,指出异步函数(返回 TaskTask<> 的函数)是同步执行的。

我们不支持本地模拟器。开发时必须使用真实的 Storage Account。

【讨论】:

那是“不支持异步方法”,对吧? ;) @VictorHurdugaci - 我想我的目标是我只需要能够使用我的共享/第 3 方库的异步方法。如果 JobHost 同步处理它们,那很好(现在)。 @StephenCleary 我们正在考虑在未来发布该功能。 @ericb 即使在不返回 Task 和/或未标记为 async 的方法中,您也可以使用 Task<>.WaitForResult( .. ) 以同步方式使用异步方法。当我们看到异步函数时,这就是我们在 WebJobs 中所做的。 @VictorHurdugaci 在我的代码中我有类似这样的东西 public static void DeployToExchange([QueueInput(Constants.DeployToExchangeQueueName)] DeployToOwaCommand deploytoExchangeCommand) System.Threading.Tasks.Task.Run(() => 并且它看起来有效。我做错了什么吗?【参考方案2】:

随着时间的推移,答案是现在,yes, you can!

【讨论】:

这里是更官方的链接:azure.microsoft.com/blog/2014/08/21/…

以上是关于Azure WebJobs - 我可以使用异步方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 中的 Azure WebJobs 使用 VS 2017 15.3

异常 Microsoft.Azure.WebJobs.Script.Workers.Rpc.RpcException

如何扩展 Azure Webjobs

在 Azure Webjobs SDK 中设置 nextVisibleTime

Azure 服务总线:Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放,无法使用

无法加载文件或程序集“Microsoft.Azure.WebJobs.Host,版本=3.0.22.0