首页 > 解决方案 > 使用 Parallel.Invoke 使用 microsoft graph 的 C# 中的 Windows 服务处于运行状态但无法正常工作

问题描述

在 Windows 服务中,我们使用 Microsoft graph 连接到多个邮箱、阅读邮件和下载附件。我们为每个邮箱使用单独的类,并使用 Parallel.Invoke() 方法调用每个类。

Parallel.Invoke(() =>
{                       
    ParallelThreadOne.MainAsync().Wait();
},
() =>
{                       
    ParallelThreadSecond.MainAsync().Wait();
});

在每个线程中,我们都调用 Microsoft GraphGraphServiceClient来获取用户令牌以进行进一步处理。

问题:

  1. Windows 服务运行良好,但一段时间后服务处于运行状态但没有执行任何操作,并且日志记录也停止。
  2. 重新启动服务后,它可以正常使用日志记录。
  3. 该服务应该 24x7 全天候运行。

如何解决这个问题?

标签: c#multithreadingmicrosoft-graph-api

解决方案


请使用 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)并在您的服务中读回它。

问候


推荐阅读