In the past I wrote a post how to migrate Windows service to Azure using Azure WebJobs. Another option for migration of Windows service to Azure is to use Azure Functions.

Windows service I want to migrate to Azure acts as runtime for execution of scheduled jobs using Timer
, which run every 60 seconds to execute scheduled jobs. JobSchedulerService
execute JobExecutor.Execute()
method every 60 seconds as visible in source code of Windows service:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public partial class JobSchedulerService : ServiceBase
{
private Timer timer;
public JobSchedulerService()
{
InitializeComponent();
}
protected override void OnStart( string [] args)
{
timer = new Timer();
timer.Elapsed += OnTimer;
timer.Interval = 60 * 1000;
timer.Start();
}
protected override void OnStop()
{
timer.Stop();
}
private void OnTimer( object sender, ElapsedEventArgs e)
{
JobExecutor.Execute();
}
}
|
To convert Windows service to Azure Function, add new project to Visual Studio solution:

Select Azure Functions v1 (.NET Framework) as version, because Windows service is build on .NET Framework 4.7.2. Then select Timer trigger, none Storage Account and enter schedule “0 * * * * *”, which is CRON expression for triggering run every 60 seconds.

Code changes in function are simple, only call of JobExecutor.Execute()
is added into Run
method:
1 2 3 4 5 6 7 8 | public static class JobSchedulerFunction
{
[FunctionName( "JobSchedulerFunction" )]
public static void Run([TimerTrigger( "0 * * * * *" )]TimerInfo timer, TraceWriter log)
{
JobExecutor.Execute();
}
}
|
Next step is to create Azure resources to run Azure Function using Azure CLI:
1 2 3 4 5 6 7 8 9 10 11 12 | az group create --name WinServiceToAzureTest --location westeurope
az storage account create --resource-group WinServiceToAzureTest --name winservicetoazuretest --sku Standard_LRS --kind StorageV2
az monitor app-insights component create --resource-group WinServiceToAzureTest --app WinServiceToAzureTest --location westeurope --kind web
az functionapp create --name WinServiceToAzureTest --resource-group WinServiceToAzureTest --storage-account winservicetoazuretest --app-insights WinServiceToAzureTest --consumption-plan-location westeurope --runtime dotnet
az functionapp config appsettings set --name WinServiceToAzureTest --resource-group WinServiceToAzureTest --settings "FUNCTIONS_EXTENSION_VERSION=~1"
|
After finishing of run is created new Resource Group, Storage Account, Application Insights and finally Function App. Important part is here to set Azure Functions runtime to version 1 using application setting FUNCTIONS_EXTENSION_VERSION
.
Deployment of Azure Functions to Azure can be done by combination of PowerShell and Azure CLI:
1 2 | Compress-Archive -Path .\bin\Release\net472\* -DestinationPath WindowsServiceToAzure.Job. Function .zip
az functionapp deployment source config-zip --resource-group WinServiceToAzureTest --name WinServiceToAzureTest --src .\WindowsServiceToAzure.Job. Function .zip
|
After deployment is Azure Function running, which is visible on Function App dashboard:

Azure Function integration diagram displays function input and outputs:

Detailed logs about the activity of Azure Function is visible in monitor:

Cleanup of used Azure resources can be done using Azure CLI:
1 | az group delete --name WinServiceToAzureTest --yes -y
|
If you are interested in Windows services and how to migrate them to Azure, take my Udemy course Migrate Windows service to Azure.