Разрешение отладки в Framework 4.7.2 Async Windows Service, которая использует Quartz.netC#

Место общения программистов C#
Ответить
Anonymous
 Разрешение отладки в Framework 4.7.2 Async Windows Service, которая использует Quartz.net

Сообщение Anonymous »

Я пытался правильно реализовать отладку для службы Windows .net 4.7.2, которая использует Quartz. Я использовал nito.asyncex, чтобы запустить и остановить планировщик кварца внутри OnStart и Onstop . Таким образом, начиная с реализации Quartz ijob (, фактическая работа, выполняемая службой Windows), она может быть асинхронно. Тем не менее, я в конечном итоге застрял с иногда ASYNC Program.cs (см. Ниже): < /p>
program.cs:

Код: Выделить всё

static class Program
{
static async Task Main()
{
var myService = new MyWin32Service();
#if DEBUG
await myService.OnDebugAsync();
#else
ServiceBase.Run(myService);
#endif
}
}
< /code>
mywin32service.cs:
public partial class MyWin32Service : ServiceBase
{
private IScheduler scheduler = null;
public MyWin32Service()
{
InitializeComponent();
}

protected override void OnStart(string[] args)
{
using (AsyncContextThread thread = new AsyncContextThread())
{
thread.Factory.Run(async () => await SetupQuartzSchedulerAsync());
thread.Join();
}
}

protected override void OnStop()
{

if (scheduler != null)
{
using (AsyncContextThread thread = new AsyncContextThread())
{
thread.Factory.Run(async () => await TeardownQuartzSchedulerAsync());
thread.Join();
}
}
}
#if DEBUG
public async Task OnDebugAsync()
{
var job = new MyJob(); //implements Quartz IJob interface
await job.Execute(null);
}
#endif
//these methods works fine, and we skip them for debugging since we mainly care about the work done inside MyJob
protected async Task SetupQuartzSchedulerAsync(){...}
protected async Task TeardownQuartzSchedulerAsync(){...}
}
Текущая проблема с вышеупомянутым кодом заключается в том, что он дает предупреждение («В этом асинхронном методе не хватает операторов« ожидание »и будет работать синхронно ...») при создании в конфигурациях без делебжа, поскольку нечего дождаться . Я знаю, что могу просто добавить await task.completedtask; в конце раздела, не связанного с De-Debug, чтобы избавиться от предупреждения, но он чувствует себя запутанным и трудно объяснить/поддерживать. Если я понимаю это правильно, я должен добавить строку производственного кода, которая не делает ничего, чтобы удалить предупреждение, и единственная причина состоит в том, чтобы включить отладку. Это, по -видимому, заставляет программу преждевременно прекратить в определенных вариантах использования многопоточных чтений (что понятно, библиотека nito.asyncex не предназначена для многопоточного чтения). Фактически, Стивен Клири упоминает, что хочет написать пример сервиса Windows в комментариях по этому вопросу, но упоминает, что он никогда не писал хорошее решение для .NET Framework (и он рекомендует переключиться на новую .NET с хостированными услугами, что я хотел бы сделать, но не могу по причинам за пределами моего текущего сфера). (который использует quartz.net), сохраняя при этом код, специфичный для отладки, из сборки релиза? Нужно ли преобразовать main () обратно в синхронный метод и отладка, используя некоторую комбинацию .wait () /

Код: Выделить всё

.GetAwaiter().GetResult()
/

Код: Выделить всё

Thread.Sleep()
, как упоминалось в других подобных вопросах?

Подробнее здесь: https://stackoverflow.com/questions/797 ... t-uses-qua
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»