等待杀死进程

2023-12-06

我正在尝试连接到 Azure AD 并且正在使用此代码。

try
{
    var clientCredential = new ClientCredential(_clientId, _clientSecret);
    var authContext = new AuthenticationContext(AuthUri + _tenant);
    var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential);
    var authString = authResult.CreateAuthorizationHeader();
    var client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var request = new HttpRequestMessage
    {
        Method = HttpMethod.Get,
        RequestUri = _requestUri,
    };
    request.Headers.Add("Authorization", authString);
    HttpResponseMessage response = null;
    await client.SendAsync(request).ContinueWith(taskWithMessage =>
    {
        response = taskWithMessage.Result;
    });
    return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
   Console.WriteLine(ex);
}

我不明白的一个大问题是,当执行到达第一个等待时(var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential);)该进程被简单地杀死。没有抛出任何异常,什么也没有。

如果我将该行替换为

var authResult = authContext.AcquireTokenAsync(GraphUri,clientCredential); 
var authString = authResult.Result.CreateAuthorizationHeader();

执行一直持续到await client.SendAsync(request).ContinueWith(taskWithMessage...进程再次被终止,没有抛出任何异常或任何警告消息或其他内容。

更奇怪的是,这段代码在另一个项目中运行得很好,但在这里它不起作用。

Edit:

static void ImportLicence()
{
   InsertToDb();
}

public async void InsertoDb()
{
   var x = await GetSP();
}

public async Task<Dictionary<ServicePlanViewModel, List<ServicePlanViewModel>>> GetSP()
{
   var sp = await MakeRq();
}

public async Task<string> MakeRequest()
{
   var authString = await GetAuth();
   ..........
   return await response.Content.ReadAsStringAsync();
}

private async Task<string> GetAuth()
{
   .....
   var authResult = await authContext.AcquireTokenAsync(GraphUri, clientCredential);
   return authResult.CreateAuthorizationHeader();
}

该进程被简单地杀死。没有抛出任何异常,什么也没有。

我假设您在控制台应用程序中运行它,并且您的顶级代码将如下所示:

static void Main()
{
  MyMethodAsync();
}

在这种情况下,main 方法实际上会退出,因为它不会等待异步代码完成。

一种合作方式async在控制台应用程序中是阻止Main方法。通常,您想要“一直异步”,但是控制台应用程序Main方法是此规则的一个例外:

static void Main() => MainAsync().GetAwaiter().GetResult();
static async Task MainAsync()
{
  // Original code from Main, but adding any necessary `await`s.
  await MyMethodAsync();
}

Update: 不要使用async void; use async Task反而:

static async Task ImportLicenceAsync()
{
  await InsertToDbAsync();
}

public async Task InsertoDbAsync()
{
  var x = await GetSPAsync();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

等待杀死进程 的相关文章

随机推荐

  • 从Win32_PrintJob获取总页数

    Win32 PrintJob WMI 类具有许多属性 看 MSDN 上的 Win32 PrintJob 我有一个小型 NET 应用程序 用于显示打印作业并显示作业信息 The TotalPages属性给出了发送的页面数量 但该数字并未考虑用
  • 使用 MinGW-w64 在 MSYS2 上编译 BASIS

    我正在努力追随这些说明使用 MinGW w64 编译器在 MSYS2 上编译安装 BASIS CMake 构建系统和软件实现标准 但是 那ccmake 步骤失败 bash ccmake 找不到命令 我尝试通过以下方式搜索 MSYS2 软件包
  • R ggplot2 梯度图离散调色板

    在 SO 用户的帮助下 我现在可以使用以下命令绘制渐变图geom tile and scale fill gradient 现在我需要指定一个固定的调色板 我的第一次尝试是使用scale fill manual但我收到此错误消息 错误 提供
  • 如何在 Smack 中正确监听 MultiUserChat?

    我不确定如何正确监听 MultiUserChats 因为显然有两种不同的方式来监听它们 第一种方法是为每个房间添加一个 MessageListener 如下所示 MultiUserChat muc new MultiUserChat con
  • python中a = x和a=x[:]有什么区别[重复]

    这个问题在这里已经有答案了 我正在努力学习Python 有人可以帮助我理解以下两者之间的区别 a x 与 a x a x创建一个参考 a 2 x a print id a print id x 生产 39727240 39727240 所以
  • 使 log4j 控制台附加程序对不同线程使用不同颜色

    我正在追踪一些并发问题 当登录到控制台时 让每个线程的输出行以不同的颜色显示将非常有帮助 我使用的是 OS X 可以使用转换模式来输出一些控制代码来完成此操作 还是需要自定义附加程序 有人知道怎么做吗 2011 10 21 12 14 42
  • while(*p){p++;} 、while(*++p){;} 和 while(*p++){;} 有什么区别?

    是关于strcat功能 while p p and while p 两者都有效 但是 while p 不起作用 我认为第一和第三应该是相同的 但事实并非如此 我们假设p是一个字符串 while p p 1 while p 2 while p
  • 使用带 MVVM 指示灯的“X”按钮关闭窗口时进行确认

    我正在使用 WPF 和 MVVM Light 框架 我是新使用它们的 我想做以下事情 当用户单击 X 关闭按钮时 我想显示一个确认窗口 以确定他是否要退出应用程序 如果是 则应用程序关闭 如果否 则不会发生任何事情 他仍然可以正常使用该应用
  • gzip 使用 symfony2 压缩动态内容

    是否容易 可能告诉 symfony2 尊重 Web 浏览器发送的 Accept Encoding 标头以及 如果可能 gzip 压缩响应中呈现的内容 基于http developer yahoo com performance rules
  • 消息日期属性的架构名称

    我试图通过 PropertyAccessor 读取和写入消息日期 发送 接收 但无法弄清楚该属性的架构名称是什么 甚至不确定我是否正确传递了架构参数 正确的架构名称是什么 如何正确传递参数GetProperty and SetPropert
  • Powershell regex -replace 匹配的频率比应有的要高

    我有以下正则表达式 a z A Z 当我将它插入 RegEx 101 时 它似乎工作得很好 https regex101 com r vhifNL 1 但是当我将其插入 Powershell 以将匹配项替换为破折号时 它变得疯狂 JavaS
  • 使用 jquery 保存会话变量似乎不起作用

    我在存储会话时遇到问题 我正在使用的代码 save to session session compareLeftContent value alert session compareLeftContent http jsfiddle net
  • MongoDB 数组中对象的聚合总和

    我已经看到了很多关于如何对数组中的数组中的对象的属性求和的答案 但我正在尝试对跨文档的数组中的对象的各个属性求和 例如 给定此文档结构 id 1 stats number 100 year 2014 number 200 year 2015
  • 无法在 Netbean 中加载身份验证插件“caching_sha2_password”

    我正在使用 Netbean 连接 MySQL 8 0 并收到错误 无法加载身份验证插件 caching sha2 password 有什么解决办法吗 您应该使用 MySQL Connector J 8 0 9 或更高版本 对于 Window
  • 在不使用 Maven 的情况下在 NetBeans 上使用 Vaadin

    我从 Vaadin 开始 我想知道是否可以在 NetBeans 中使用这个框架而不使用 Maven 原因是使用 maven 的项目需要很长时间才能下载依赖项 并且由于连接超时问题而无法运行 我已经下载了多合一文件并尝试遵循这些 README
  • 如何使用表达式设计向图标添加 Windows Phone 系统颜色?

    我正在尝试在 Microsoft Expression Design 中创建图标 但我想添加系统资源颜色 例如手机背景和前景 以便当用户更改主题时图标会改变颜色 有谁知道如何在Expression Design中指定Windows Phon
  • “is None”和“== None”有什么区别

    我最近遇到了这种语法 我不知道其中的区别 如果有人能告诉我其中的区别 我将不胜感激 答案已解释here 去引用 一个类可以免费实现 比较任何它选择的方式 并且它 可以选择进行比较 没有任何意义 实际上 说得通 如果有人告诉你 实现 None
  • jQuery 实时且可排序

    我有以下静态 html ul li a href 10 Item 10 a li li a href 20 Item 20 a li li a href 30 Item 30 a li li a href 40 Item 40 a li l
  • PHP' aria-label='preg_replace 排除 PHP'> preg_replace 排除 PHP

    我使用 preg replace 用 href 标签替换文本中的关键字 我的正则表达式运行得很好 现在我的代码是 newstring2 preg replace p L preg quote match i p L ui a href cl
  • 等待杀死进程

    我正在尝试连接到 Azure AD 并且正在使用此代码 try var clientCredential new ClientCredential clientId clientSecret var authContext new Auth