<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>任务 on Dapr 文档库</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/</link><description>Recent content in 任务 on Dapr 文档库</description><generator>Hugo</generator><language>zh-hans</language><atom:link href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/index.xml" rel="self" type="application/rss+xml"/><item><title>作业概述</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/jobs-overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/jobs-overview/</guid><description>&lt;p>许多应用程序需要作业调度，或者需要在未来执行某些操作。作业API是一个用于管理和安排这些未来作业的工具，可以在特定时间或间隔执行。&lt;/p>
&lt;p>作业API不仅帮助您安排作业，Dapr内部还利用调度服务来安排actor提醒。&lt;/p>
&lt;p>在Dapr中，作业包括：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/jobs_api/">作业API构建模块&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/concepts/dapr-services/scheduler/">调度器控制平面服务&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/jobs-overview/#scenarios">查看示例场景。&lt;/a>&lt;/p>
&lt;img src="https://v1-18.docs.dapr.io/images/scheduler/scheduler-architecture.png" alt="显示调度器控制平面服务和作业API的图示">
&lt;h2 id="工作原理">工作原理&lt;/h2>
&lt;p>作业API是一个作业调度器，而不是作业的执行者。设计上保证作业至少执行一次，注重可靠性和可扩展性，而非精确性。这意味着：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>保证：&lt;/strong> 作业不会在计划时间之前被调用。&lt;/li>
&lt;li>&lt;strong>不保证：&lt;/strong> 作业在到期时间之后被调用的具体时间。&lt;/li>
&lt;/ul>
&lt;p>所有计划作业的详细信息和用户相关数据都存储在调度器服务的Etcd数据库中。
您可以使用作业来：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>延迟您的&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/pubsub/pubsub-overview/">pubsub消息传递&lt;/a>。&lt;/strong> 您可以在未来的特定时间发布消息（例如：一周后，或特定的UTC日期/时间）。&lt;/li>
&lt;li>&lt;strong>调度应用程序之间的&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/service-invocation/service-invocation-overview/">服务调用&lt;/a>方法。&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h2 id="场景">场景&lt;/h2>
&lt;p>作业调度在以下场景中可能会有所帮助：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>自动化数据库备份：&lt;/strong>
确保数据库每天备份以防止数据丢失。安排一个备份脚本在每晚2点运行，创建数据库备份并将其存储在安全位置。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>定期数据处理和ETL（提取、转换、加载）：&lt;/strong>
处理和转换来自各种来源的原始数据并将其加载到数据仓库中。安排ETL作业在特定时间运行（例如：每小时、每天）以获取新数据、处理并更新数据仓库中的信息。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>电子邮件通知和报告：&lt;/strong>
通过电子邮件接收每日销售报告和每周性能摘要。安排一个作业生成所需的报告并在每天早上6点通过电子邮件发送每日报告，每周一早上8点发送每周摘要。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>维护任务和系统更新：&lt;/strong>
执行定期维护任务，如清理临时文件、更新软件和检查系统健康状况。安排各种维护脚本在非高峰时段运行，如周末或深夜，以尽量减少对用户的干扰。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>金融交易的批处理：&lt;/strong>
处理需要在每个工作日结束时批处理和结算的大量交易。安排批处理作业在每个工作日下午5点运行，汇总当天的交易并执行必要的结算和对账。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Dapr的作业API确保这些场景中表示的任务在没有人工干预的情况下始终如一地执行，提高效率并减少错误风险。&lt;/p>
&lt;h2 id="特性">特性&lt;/h2>
&lt;p>作业API提供了多种特性，使您可以轻松调度作业。&lt;/p>
&lt;h3 id="在多个副本之间调度作业">在多个副本之间调度作业&lt;/h3>
&lt;p>调度器服务支持在多个副本之间扩展作业调度，同时保证作业仅由一个调度器服务实例触发。&lt;/p>
&lt;h2 id="试用作业api">试用作业API&lt;/h2>
&lt;p>您可以在应用程序中试用作业API。在&lt;a href="https://v1-18.docs.dapr.io/zh-hans/getting-started/install-dapr-cli/">Dapr安装完成后&lt;/a>，您可以开始使用作业API，从&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs/">如何：调度作业指南&lt;/a>开始。&lt;/p>
&lt;h2 id="下一步">下一步&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs/">了解如何使用作业API&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/concepts/dapr-services/scheduler/">了解更多关于调度器控制平面服务的信息&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/jobs_api/">作业API参考&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>操作指南：调度和处理触发的作业</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs/</guid><description>&lt;p>现在您已经了解了&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/jobs/jobs-overview/">作业构建块&lt;/a>提供的功能，让我们来看一个如何使用API的示例。下面的代码示例描述了一个为数据库备份应用程序调度作业并在触发时处理它们的应用程序，也就是作业因到达其到期时间而被返回到应用程序的时间。&lt;/p>
&lt;!-- 
如果可能，包含一个图表或图像。
-->
&lt;h2 id="启动调度器服务">启动调度器服务&lt;/h2>
&lt;p>当您&lt;a href="https://v1-18.docs.dapr.io/zh-hans/getting-started/install-dapr-selfhost/">在本地托管模式或Kubernetes上运行&lt;code>dapr init&lt;/code>&lt;/a>时，Dapr调度器服务会启动。&lt;/p>
&lt;h2 id="设置作业api">设置作业API&lt;/h2>
&lt;p>在您的代码中，配置并调度应用程序内的作业。&lt;/p>






&lt;ul class="nav nav-tabs" id="tabs-2" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
 data-td-tp-persist=".net" aria-controls="tabs-02-00" aria-selected="true">
 .NET
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
 data-td-tp-persist="go" aria-controls="tabs-02-01" aria-selected="false">
 Go
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-2-content">
 &lt;div class="tab-body tab-pane fade show active"
 id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
 &lt;!-- .NET -->
&lt;p>以下.NET SDK代码示例调度名为&lt;code>prod-db-backup&lt;/code>的作业。作业数据包含有关您将定期备份的数据库的信息。在本示例中，您将：&lt;/p>
&lt;ul>
&lt;li>定义在示例其余部分中使用的类型&lt;/li>
&lt;li>在应用程序启动期间注册一个端点，以处理服务上的所有作业触发调用&lt;/li>
&lt;li>向Dapr注册作业&lt;/li>
&lt;/ul>
&lt;p>在以下示例中，您将创建记录，序列化并与作业一起注册，以便在将来作业被触发时可以使用这些信息：&lt;/p>
&lt;ul>
&lt;li>备份任务的名称（&lt;code>db-backup&lt;/code>）&lt;/li>
&lt;li>备份任务的&lt;code>Metadata&lt;/code>，包括：
&lt;ul>
&lt;li>数据库名称（&lt;code>DBName&lt;/code>）&lt;/li>
&lt;li>数据库位置（&lt;code>BackupLocation&lt;/code>）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>创建一个ASP.NET Core项目，并从NuGet添加最新版本的&lt;code>Dapr.Jobs&lt;/code>。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>注意：&lt;/strong> 虽然您的项目不严格需要使用&lt;code>Microsoft.NET.Sdk.Web&lt;/code> SDK来创建作业，但在撰写本文档时，只有调度作业的服务会接收到其触发调用。由于这些调用期望有一个可以处理作业触发的端点，并且需要&lt;code>Microsoft.NET.Sdk.Web&lt;/code> SDK，因此建议您为此目的使用ASP.NET Core项目。&lt;/p>&lt;/blockquote>
&lt;p>首先定义类型以持久化我们的备份作业数据，并将我们自己的JSON属性名称属性应用于属性，以便它们与其他语言示例保持一致。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cs" data-lang="cs">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">//定义我们将用来表示作业数据的类型&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">internal&lt;/span> &lt;span style="color:#204a87;font-weight:bold">sealed&lt;/span> &lt;span style="color:#204a87;font-weight:bold">record&lt;/span> &lt;span style="color:#000">BackupJobData&lt;/span>&lt;span style="color:#000;font-weight:bold">([&lt;/span>&lt;span style="color:#000">property&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">JsonPropertyName&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;task&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)]&lt;/span> &lt;span style="color:#204a87;font-weight:bold">string&lt;/span> &lt;span style="color:#000">Task&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>&lt;span style="color:#000">property&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">JsonPropertyName&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;metadata&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)]&lt;/span> &lt;span style="color:#000">BackupMetadata&lt;/span> &lt;span style="color:#000">Metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">internal&lt;/span> &lt;span style="color:#204a87;font-weight:bold">sealed&lt;/span> &lt;span style="color:#204a87;font-weight:bold">record&lt;/span> &lt;span style="color:#000">BackupMetadata&lt;/span>&lt;span style="color:#000;font-weight:bold">([&lt;/span>&lt;span style="color:#000">property&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">JsonPropertyName&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;DBName&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)]&lt;/span>&lt;span style="color:#204a87;font-weight:bold">string&lt;/span> &lt;span style="color:#000">DatabaseName&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>&lt;span style="color:#000">property&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000">JsonPropertyName&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;BackupLocation&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)]&lt;/span> &lt;span style="color:#204a87;font-weight:bold">string&lt;/span> &lt;span style="color:#000">BackupLocation&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>接下来，作为应用程序设置的一部分，设置一个处理程序，该处理程序将在作业在您的应用程序上被触发时调用。此处理程序负责根据提供的作业名称识别应如何处理作业。&lt;/p>
&lt;p>这通过在ASP.NET Core中注册一个处理程序来实现，路径为&lt;code>/job/&amp;lt;job-name&amp;gt;&lt;/code>，其中&lt;code>&amp;lt;job-name&amp;gt;&lt;/code>是参数化的，并传递给此处理程序委托，以满足Dapr期望有一个端点可用于处理触发的命名作业。&lt;/p>
&lt;p>在您的&lt;code>Program.cs&lt;/code>文件中填入以下内容：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cs" data-lang="cs">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">using&lt;/span> &lt;span style="color:#000">System.Text&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">using&lt;/span> &lt;span style="color:#000">System.Text.Json&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">using&lt;/span> &lt;span style="color:#000">Dapr.Jobs&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">using&lt;/span> &lt;span style="color:#000">Dapr.Jobs.Extensions&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">using&lt;/span> &lt;span style="color:#000">Dapr.Jobs.Models&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">using&lt;/span> &lt;span style="color:#000">Dapr.Jobs.Models.Responses&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">var&lt;/span> &lt;span style="color:#000">builder&lt;/span> &lt;span style="color:#000;font-weight:bold">=&lt;/span> &lt;span style="color:#000">WebApplication&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">CreateBuilder&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">args&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">builder&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Services&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">AddDaprJobsClient&lt;/span>&lt;span style="color:#000;font-weight:bold">();&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">var&lt;/span> &lt;span style="color:#000">app&lt;/span> &lt;span style="color:#000;font-weight:bold">=&lt;/span> &lt;span style="color:#000">builder&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Build&lt;/span>&lt;span style="color:#000;font-weight:bold">();&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">//注册一个端点以接收和处理触发的作业&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">var&lt;/span> &lt;span style="color:#000">cancellationTokenSource&lt;/span> &lt;span style="color:#000;font-weight:bold">=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">new&lt;/span> &lt;span style="color:#000">CancellationTokenSource&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">TimeSpan&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">FromSeconds&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">5&lt;/span>&lt;span style="color:#000;font-weight:bold">));&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">app&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">MapDaprScheduledJobHandler&lt;/span>&lt;span style="color:#000;font-weight:bold">((&lt;/span>&lt;span style="color:#204a87;font-weight:bold">string&lt;/span> &lt;span style="color:#000">jobName&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">DaprJobDetails&lt;/span> &lt;span style="color:#000">jobDetails&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">ILogger&lt;/span> &lt;span style="color:#000">logger&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">CancellationToken&lt;/span> &lt;span style="color:#000">cancellationToken&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">=&amp;gt;&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">logger&lt;/span>&lt;span style="color:#000;font-weight:bold">?.&lt;/span>&lt;span style="color:#000">LogInformation&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;Received trigger invocation for job &amp;#39;{jobName}&amp;#39;&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">jobName&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">switch&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">jobName&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">case&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;prod-db-backup&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8f5902;font-style:italic">// 反序列化作业负载元数据&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">var&lt;/span> &lt;span style="color:#000">jobData&lt;/span> &lt;span style="color:#000;font-weight:bold">=&lt;/span> &lt;span style="color:#000">JsonSerializer&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Deserialize&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;lt;&lt;/span>&lt;span style="color:#000">BackupJobData&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;(&lt;/span>&lt;span style="color:#000">jobDetails&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Payload&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8f5902;font-style:italic">// 处理备份操作 - 我们假设这在您的代码中已实现&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">await&lt;/span> &lt;span style="color:#000">BackupDatabaseAsync&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">jobData&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">cancellationToken&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">break&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">},&lt;/span> &lt;span style="color:#000">cancellationTokenSource&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">Token&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">await&lt;/span> &lt;span style="color:#000">app&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">RunAsync&lt;/span>&lt;span style="color:#000;font-weight:bold">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最后，作业本身需要在Dapr中注册，以便可以在以后触发。您可以通过将&lt;code>DaprJobsClient&lt;/code>注入到类中并作为应用程序的入站操作的一部分执行此操作，但为了本示例的目的，它将放在您上面开始的&lt;code>Program.cs&lt;/code>文件的底部。因为您将使用依赖注入注册的&lt;code>DaprJobsClient&lt;/code>，所以首先创建一个范围以便可以访问它。&lt;/p></description></item></channel></rss>