c# - 使用 Parallel.Invoke 使用 microsoft graph 的 C# 中的 Windows 服务处于运行状态但无法正常工作
问题描述
在 Windows 服务中,我们使用 Microsoft graph 连接到多个邮箱、阅读邮件和下载附件。我们为每个邮箱使用单独的类,并使用 Parallel.Invoke() 方法调用每个类。
Parallel.Invoke(() =>
{
ParallelThreadOne.MainAsync().Wait();
},
() =>
{
ParallelThreadSecond.MainAsync().Wait();
});
在每个线程中,我们都调用 Microsoft GraphGraphServiceClient
来获取用户令牌以进行进一步处理。
问题:
- Windows 服务运行良好,但一段时间后服务处于运行状态但没有执行任何操作,并且日志记录也停止。
- 重新启动服务后,它可以正常使用日志记录。
- 该服务应该 24x7 全天候运行。
如何解决这个问题?
解决方案
请使用 async 和 await(基于任务的异步模式,TAP)。请阅读 Task.Run() 即https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.run?view=net-5.0。
等待多个任务:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
通常,您首先需要使用 GraphServiceClient 进行交互式登录,并且可能会缓存此(令牌)。Windows 服务无法进行交互式登录,因为底层安全沙箱(会话 0)会阻止显示表单。
提示:使用普通控制台应用程序(或 Windows 窗体应用程序)进行登录任务,缓存令牌(https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-net-token- cache-serialization?tabs=custom)并在您的服务中读回它。
问候
推荐阅读
- python - 我将如何循环遍历元素 Python Selenium
- r - 如何在 ggplot 条形图中绘制标准误差条?
- python - 逐位读取保持寄存器 Siemens
- vb.net - 从 pdf 中获取注释以添加到另一个文档
- python-2.7 - Python cron 作业返回与手动执行不同的输出
- powershell - 无法访问 Powershell 上的 API
- ffmpeg - Windows 10 EV 代码签名不再适用于电子应用程序
- azure - 在 Azure DevOps(本地)上支持小型/个人项目/存储库的最佳实践
- python - python在运行代码时生成netaddr错误
- swift - 表视图数据加载后如何停止活动视图指示器