我有一個函式應用專案,有一個定時器觸發器和一個http觸發器。(使用DI與否,似乎并不重要)
Timertrigger:
public static class Timer<
{
[FunctionName("Timer")]
public static void Run([TimerTrigger("0 */5 * * *", RunOnStartup =true)]TimerInfo myTimer, ILogger log)。
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}")。)
Thread.Sleep(10000);//this is just for demonstrating the behavior!!
log.LogInformation($"C# Timer trigger function executed done"/span>)。
}
}
http觸發器:
public static class Function1
{
[FunctionName("test2")]
public static async Task<IActionResult> Run()。
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null>) ] HttpRequest req,
ILogger log)
{
return new OkObjectResult("Done"/span>)。
}
問題是,當定時器運行時,所有的請求都被阻止了。導致 "錯誤:連接ECONNREFUSED 127.0.0.1:7071"
。我在這里和那里(主要是在評論中)讀到,不支持多個觸發器,但這對我來說沒有意義,因為無論如何,一切似乎都準備好了(我的意思是:我找不到任何關于它的結論性檔案,VS沒有拋出任何阻力來添加多個觸發器,甚至除錯介面和azure介面很好地總結了它可以找到的所有功能...)
這種行為是否是預期的,或者是否有一些我可以改變的設定,使其并行運行或如此?uj5u.com熱心網友回復:
這種行為是可以預期的,因為你通過運行Thread.Sleep()完全停止了Azure Functions的行程。只要你的函式應用沒有擴展到多個實體,就只有一個行程在運行你的函式。這就是異步作業的意義所在。
如果你把你的定時器觸發的函式改為這樣,它應該可以正常作業。
[FunctionName("Timer")]
public static async 任務 Run([TimerTrigger("0 */5 * * *", RunOnStartup=true)] TimerInfo myTimer, ILogger log)。
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}")。)
await Task.Delay(10000) 。
log.LogInformation($"C# Timer trigger function executed done")。
}
接下來請注意:
- 不建議將你的定時器觸發函式
RunOnStartup設定為true。
- 不建議在函式中明確建立延遲 。
- 不支持一個函式的多個觸發器,支持在一個函式應用程式中擁有多個函式,每個函式都有自己的觸發器 。
- 一個函式應用程式是一個或多個函式的集合 。
觸發器是導致一個函式運行的原因。觸發器定義了一個函式的呼叫方式,一個函式必須有一個確切的觸發器。觸發器有相關的資料,這些資料通常作為函式的有效載荷提供。
uj5u.com熱心網友回復:
這原來是由于 "RunOnStartup"。初始運行后的任何計劃運行都沒有這個問題......
但是,如果RunOnStartup的運行方式是 "RunOnStartup",那么就會出現這個問題。
然而,如果 RunOnStartup = false,觸發器仍然可能在啟動時被呼叫,那么它確實存在這個問題。
就像評論中所說的那樣,async不會改變任何東西(我實際上在實際場景中使用async和DI,但在這里簡化了這個例子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/333675.html
標籤:
上一篇:如何為我的自定義版本庫制作Nuget.config?
下一篇:從主頁上洗掉班級
