Фоновая внепроцессная задача (TimeTrigger) никогда не запускается (COM/CsWinRT)C#

Место общения программистов C#
Ответить
Anonymous
 Фоновая внепроцессная задача (TimeTrigger) никогда не запускается (COM/CsWinRT)

Сообщение Anonymous »

Я пытаюсь реализовать внепроцессную фоновую задачу в своем приложении WinUI 3 (.NET 9), используя подход WindowsAppSDKBackgroundTask с COM/CsWinRT. Это задача TimeTrigger, предназначенная для независимого запуска вне основного процесса приложения каждые 15 минут, но, похоже, эта задача так и не запускается. Я проверил, что задача успешно зарегистрирована, но метод Run никогда не запускается (ведение журнала не срабатывает).
Вот структура и конфигурация моего проекта.
Структура проекта

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

ProjectX.sln
├── ProjectX (Package)
│   ├── Package.appxmanifest
│   └── ProjectX (Package).wapproj
├── ProjectX.BackgroundTask (Class Library)
│   ├── ProjectX.BackgroundTask.csproj
│   └── WallpaperTask.cs
└── ProjectX.Core
└── Services
└── BackgroundTaskService.cs
ProjectX.BackgroundTask.csproj
Я настроил проект как компонент CsWinRT с включенным WindowsAppSDKBackgroundTask.

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


net9.0-windows10.0.22621.0
Library
true
true

ProjectX.BackgroundTask.WallpaperTask

...

ProjectX (Package).wapproj
Я вручную включаю в пакет DLL фоновой задачи, WinMD и хост-библиотеку WinRT.

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



[*]ProjectX.BackgroundTask.winmd
PreserveNewest




WinRT.Host.dll
PreserveNewest




ProjectX.BackgroundTask.dll
PreserveNewest




Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.dll
PreserveNewest


Package.appxmanifest
Я использую точку входа UniversalBGTask и регистрирую свою задачу в качестве суррогатного COM-сервера.

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
























Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.dll




WallpaperTask.cs (Реализация)
Соответствует CLSID в манифесте.

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

[ComVisible(true)]
[Guid("12345678-1234-1234-1234-123456789abc")] // Matches manifest
public sealed class WallpaperTask : IBackgroundTask
{
private BackgroundTaskDeferral _deferral;

public void Run(IBackgroundTaskInstance taskInstance)
{
// I grab the deferral immediately
_deferral = taskInstance.GetDeferral();

// Start async work (Void return to keep Run synchronous)
_ = RunAsyncWork();
}

private async Task RunAsyncWork()
{
try
{
// ... Application Logic ...
}
finally
{
_deferral?.Complete();
}
}
}
BackgroundTaskService.cs (Регистрация)
Я регистрируюсь через SetTaskEntryPointClsid, используя тот же GUID для настройки 15-минутного интервала.

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

var builder = new BackgroundTaskBuilder();
builder.Name = "WallpaperBackgroundTask_TimeTrigger_15min";

// Register using CLSID instead of string EntryPoint
builder.SetTaskEntryPointClsid(Guid.Parse("12345678-1234-1234-1234-123456789abc"));

// 15 minute trigger
builder.SetTrigger(new TimeTrigger(15, false));
builder.Register();
Вопросы:
  • Правильна ли моя конфигурация Package.appxmanifest для WindowsAppSDKBackgroundTask, запускаемого через TimeTrigger?
  • Правильно ли работает SetTaskEntryPointClsid с точкой входа UniversalBGTask, определенной в манифесте?
  • существуют ли какие-либо известные проблемы с .NET 9 и CsWinRTComponent, которые препятствуют запуску процесса фоновой задачи?


Подробнее здесь: https://stackoverflow.com/questions/798 ... om-cswinrt
Ответить

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

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

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

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

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