【发布时间】:2023-02-13 12:06:05
【问题描述】:
我用 C# 编写了一个 WinUi 3 MVVM 应用程序,用于同步 c:\*\Docs\myApp\files 中用户在 Firebase 上托管的 Web 项目中的未来文件。
它已经连接到数据库,现在我需要一种方法来定期同步文件。
我发现了一些关于后台任务的东西,试图实现这个但失败了。我发现这是针对 UWP 项目的,为时已晚。
基本问题,我需要 BackgroundTasks 吗?还有其他方法吗?可能是 Windows 服务项目?
如果后台任务是我需要的,这里是我的文件:
Package.appxmanifest
<Package [...]>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="$targetentrypoint$">
[...]
<Extensions>
[...]
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.BackgroundTask">
<BackgroundTasks>
<Task Type="timer" />
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
</Applications>
<Extensions>
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>PitBoard ACC Livery Manager.dll</Path>
<ActivatableClass ActivatableClassId="BackgroundTasks.BackgroundTask" ThreadingModel="both" />
</InProcessServer>
</Extension>
</Extensions>
[...]
</Package>
应用程序.xaml.cs
public App()
{
InitializeComponent();
Host = Microsoft.Extensions.Hosting.Host.
CreateDefaultBuilder().
UseContentRoot(AppContext.BaseDirectory).
ConfigureServices((context, services) =>
{
[...]
services.AddSingleton<BackgroundTaskService>();
}).
Build();
UnhandledException += App_UnhandledException;
}
protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
base.OnLaunched(args);
await App.GetService<BackgroundTaskService>().RegisterBackgroundTasksAsync().ConfigureAwait(false);
}
后台任务服务
public async Task RegisterBackgroundTasksAsync()
{
BackgroundExecutionManager.RemoveAccess();
var result = await BackgroundExecutionManager.RequestAccessAsync();
if (result == BackgroundAccessStatus.DeniedBySystemPolicy
|| result == BackgroundAccessStatus.DeniedByUser)
{
return;
}
foreach (var task in BackgroundTasks)
{
task.Register();
}
}
同步后台任务
public override void Register()
{
var taskName = GetType().Name;
var taskRegistration = BackgroundTaskRegistration.AllTasks.FirstOrDefault(t => t.Value.Name == taskName).Value;
if (taskRegistration == null)
{
var builder = new BackgroundTaskBuilder()
{
Name = taskName
};
// details at https://docs.microsoft.com/windows/uwp/launch-resume/create-and-register-an-inproc-background-task
builder.SetTrigger(new TimeTrigger(30, false));
// TODO: Find someone who can get this Background Task running
builder.Register();
}
}
builder.Register(); 引发未处理的异常“值不在预期范围内”
【问题讨论】:
-
我可以重现同样的问题,如果 In-Progress 支持 WinUI3,我会和团队讨论。服务可以参考这个:learn.microsoft.com/en-us/windows/win32/services/using-services
标签: c# service synchronization winui-3 background-task