2017-10-04 15 views
9

Tôi có một vài hàm C# Azure chạy trên lịch biểu sử dụng timer triggers. Tôi đã thiết lập chúng như vậy, nơi %TimerSchedule% đề cập đến một biểu thức cron trong cài đặt ứng dụng:Cách đơn giản nhất để chạy chức năng Azure được kích hoạt hẹn giờ cục bộ một lần là gì?

public static void Run([TimerTrigger("%TimerSchedule%")]TimerInfo myTimer, TraceWriter log) 

Trong phát triển, tôi thường muốn chạy các chức năng tại địa phương sử dụng Azure Chức năng Công cụ cho Visual Studio + Chức năng Azure lõi Công cụ. Nhưng khi tôi nhấn F5 để gỡ lỗi các chức năng cục bộ nó (thường) không chạy ngay lập tức. Thay vào đó, nó bắt đầu chờ đợi cho sự xuất hiện tiếp theo theo lịch trình hẹn giờ. Vì vậy, ví dụ, nếu biểu thức cron của tôi nói để chạy hàng ngày lúc 8 giờ tối, tôi phải đợi đến 8 giờ tối để chức năng thực sự chạy trên máy của tôi.

Vì vậy, câu hỏi của tôi là: Cách đơn giản nhất và tốt nhất để thực hiện một hàm chạy cục bộ là gì?

Những điều tôi đã cố gắng hoặc xem xét:

  1. Sử dụng một bộ đếm thời gian lịch trình thường xuyên hơn chỉ dành riêng cho phát triển địa phương
    • Đây là OK nhưng không hoàn hảo - bạn vẫn phải chờ một chút trừ khi đó là rất thường xuyên, và nếu nó rất thường xuyên thì chức năng có thể chạy nhiều lần. Đây là những gì tôi đang làm bây giờ.
  2. Viết một ứng dụng giao diện điều khiển hoặc kiểm tra đơn vị trực tiếp gọi của chức năng phương pháp Run()
    • Đây không phải là 100% đơn giản bởi vì bạn phải cung cấp TimerInfoTraceWriter đối số cho Run() - và tôi đã tìm thấy ngạc nhiên ít tài liệu cho điều đó.

của Microsoft trang Strategies for testing your code in Azure Functions không phải là rất hữu ích về chủ đề này - nó chỉ đề cập đến bộ đếm thời gian gây nên như là một cách để kiểm tra loại cò khác.

Trong một thế giới hoàn hảo, tôi nhấn F5 và chức năng sẽ chạy ngay lập tức một lần - giống như phát triển ứng dụng .NET "bình thường".

Trả lời

12

Bạn có thể sử dụng cờ RunOnStartup làm tài liệu here. Nó không hoàn toàn đáp ứng ngắn gọn của bạn liên quan đến nó chỉ chạy một lần, nhưng nó ít nhất nên thực hiện nó tại địa phương một khi ứng dụng đã bắt đầu.

/// Gets or sets a value indicating whether the function should be invoked 
/// immediately on startup. After the initial startup run, the function will 
/// be run on schedule thereafter. 

Ví dụ sử dụng thuộc tính ràng buộc:

[TimerTrigger("%TimerSchedule%", RunOnStartup = true)]TimerInfo myTimer

+0

Tôi thích hợp trong suy nghĩ rằng điều này cũng sẽ chạy chức năng một lần trong đám mây bất cứ khi nào tôi triển khai chức năng? [Nhận xét này] (https://stackoverflow.com/a/44573176/854694) dường như cho biết có. Nếu vậy, đây là một bước tiến lớn trong hướng đi đúng đắn nhưng có một chút không may là nó sẽ phải được hoàn nguyên trước khi triển khai nếu tôi không muốn thay đổi hành vi "sản xuất". –

+2

@ripley_ vâng, tôi tin rằng bạn sẽ chính xác.Một tùy chọn có thể là bạn ràng buộc boolean vào một biến trong cấu hình của bạn, tương tự như cách bạn đã ràng buộc 'TimerSchedule' của bạn. Từ đó, bạn có thể đặt phát triển cục bộ của mình thành true và môi trường sản xuất của bạn (hoặc các môi trường khác) được đặt thành false, như bạn thấy phù hợp. –

Các vấn đề liên quan