Я делаю что-то похожее на то, что вы просите. Я запрограммировал его так, что если вы отправите параметр командной строки "/ form" в исполняемый файл, он будет отображаться в форме Windows, а не в качестве службы.
Что касается запуска самого фонового задания, в обоих случаях вам потребуется выполнить какую-то многопоточность (возможно, с таймером), чтобы выполнить работу и сообщить статус обратно в форму асинхронно. Это будет совершенно другая тема для обсуждения по созданию многопоточных приложений с графическим интерфейсом.
Код "форма или служба" выглядит примерно так:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
private static void Main(string[] args)
{
if (args.Length > 0 && args[0] == "/form")
{
var form = new MainForm();
Application.Run(form);
return;
}
var ServicesToRun = new ServiceBase[]
{
new BackgroundService()
};
ServiceBase.Run(ServicesToRun);
}
}