- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
SemaphoreSlim.WaitAsync
不管用。它跳转到 return currentToken.AccessToken
之前GetAccesTokenAsync
调用它已完成并抛出 NullException。我还尝试使用 AsyncLock、AsyncSemaphore 和我在网上阅读的其他一些方法,但在我的情况下似乎没有任何作用。
public static class HttpClientHelper
{
#region members
private static SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
private static Token currentToken;
#endregion
public static string GetAuthorizeToken(ref HttpClient client, string username, string password)
{
GetToken(client, username, password);
return currentToken.AccessToken;
}
private static async void GetToken(HttpClient client, string username, string password)
{
await semaphore.WaitAsync();
try
{
if (currentToken == null)
{
await GetAccesTokenAsync(client, username, password);
}
else if (currentToken.IsExpired)
{
await GetAccessTokenByRefreshToken(client);
}
}
finally
{
semaphore.Release();
}
}
private static async Task<Token> GetAccesTokenAsync(HttpClient client, string username, string password)
{
List<KeyValuePair<string, string>> requestBody = new List<KeyValuePair<string, string>>();
requestBody.Add(new KeyValuePair<string, string>("Username", username));
requestBody.Add(new KeyValuePair<string, string>("Password", password));
requestBody.Add(new KeyValuePair<string, string>("grant_type", "password"));
try
{
using (var urlEncodedContent = new FormUrlEncodedContent(requestBody))
{
var httpResponse = await client.PostAsync(new Uri(client.BaseAddress + "/api/authentication/token"), urlEncodedContent);
currentToken = await httpResponse.Content.ReadAsAsync<Token>(new[] { new JsonMediaTypeFormatter() });
}
return currentToken;
}
catch (Exception e)
{
Logers.Log.Error($"Error while getting the access token {e}");
return null;
}
}
}
最佳答案
您需要做的第一件事是更改您的 private static async void GetToken()
返回任务的方法声明:private static async Task GetToken()
.如果它不返回任务,您将无法等待它完成。 (正如 GSerg 所说,“async void”是“即发即忘”。)
从同步方法调用异步方法的最基本方法是使用 Task.Run(...).Wait()
, 如下所示。
注意拨打Task.Run(waitForSem).Wait();
这实际上是将异步调用转换为同步调用。
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
Parallel.Invoke(() => timeWaitForSem(1), () => timeWaitForSem(2));
Console.ReadLine();
}
static void timeWaitForSem(int id)
{
var sw = Stopwatch.StartNew();
Console.WriteLine($"Thread {id} is waiting for semaphore.");
Task.Run(waitForSem).Wait(); // <=== HERE is the important bit.
Console.WriteLine($"Thread {id} finished waiting for semaphore after {sw.Elapsed}.");
}
static async Task waitForSem()
{
await _semaphore.WaitAsync().ConfigureAwait(false);
// Keep hold of the semaphore for a while.
await Task.Delay(2000).ConfigureAwait(false);
_semaphore.Release();
}
static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
}
}
该程序的输出将类似于:
Thread 1 is waiting for semaphore.
Thread 2 is waiting for semaphore.
Thread 1 finished waiting for semaphore after 00:00:02.0133882.
Thread 2 finished waiting for semaphore after 00:00:04.0316629.
你不能做的是简单地输入
waitForSem().Wait();
而不是
Task.Run(waitForSem).Wait();
,因为您很可能会以这种方式陷入死锁(尤其是从具有消息泵的应用程序(例如 WinForms)调用它时)。
Microsoft.VisualStudio.Threading.dll
.要使用它,您需要引用
Microsoft.VisualStudio.Threading.dll
或通过 NuGet 添加。
JoinableTaskFactory
,代码如下所示:
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.VisualStudio.Threading;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
Parallel.Invoke(() => timeWaitForSem(1), () => timeWaitForSem(2));
Console.ReadLine();
}
static void timeWaitForSem(int id)
{
var sw = Stopwatch.StartNew();
Console.WriteLine($"Thread {id} is waiting for semaphore.");
_jtf.Run(async () => await waitForSem().ConfigureAwait(false));
Console.WriteLine($"Thread {id} finished waiting for semaphore after {sw.Elapsed}.");
}
static async Task waitForSem()
{
await _semaphore.WaitAsync().ConfigureAwait(false);
// Keep hold of the semaphore for a while.
await Task.Delay(2000).ConfigureAwait(false);
_semaphore.Release();
}
static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
static readonly JoinableTaskFactory _jtf = new JoinableTaskFactory(new JoinableTaskContext());
}
}
关于c# - 为什么 SemaphoreSlim.WaitAsync 不起作用?它在 GetAccesTokenAsync 调用完成之前跳转到 "return currentToken.AccessToken",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63503496/
我有两个函数,在 C++ 中看起来像这样: void f1(...); void f2(...); 我可以更改 f1 的主体,但是 f2 是在另一个我无法更改的库中定义的。我绝对必须(尾部)在f1 中
我正在尝试避免这个 while 循环出了什么问题 while True: start = input("Ok, are you ready now?\n") if (start !=
当我点击按钮加载页面时,它加载正常。调整浏览器大小后,此页面会不断刷新。我复制了布局页面的一部分,用于处理按钮。如果我遗漏了什么,你能告诉我吗? Statistics 最佳答案 确保没有在“调
PHP的header函数 可以很少代码就能实现HTML代码中META 标签 这里只说用 header函数来做页面的跳转 1. HTML代码中页面的跳转的代码 HTML meta refresh 刷
我使用并喜欢 Tim Pope's excellent Fugitive plugin for VIM ,我一直希望能够加载 :Glog quickfix 中所有文件的差异,并通过它们循环到 HEAD
当我访问 my_site.com/page.php#something 时,滚动位置是携带此特定主题标签的元素之一,而不是页面顶部。 执行 window.scrollTo(0, 0); 不会改变这一事
在我自己的一个应用程序中看到这一点后,我构建了一个测试应用程序。 我在导航 Controller 中嵌入了一个集合 View 。 这一切都链接到 ViewController 类。 class Vie
在我们的应用程序中,当其中一个 View 被推送到导航 Controller 时,导航栏会显示 5 秒,然后我们将 navigationBarHidden 设置为 TRUE。稍后,如果用户点击屏幕,我
我必须更新滚动 UITextView 中的少量文本。我只会在光标当前所在的位置插入一个字符,并且只需按一下导航栏上的按钮即可执行此操作。 我的问题是,每当我调用 TextView 的setText方法
我正在使用第三方脚本(详细信息如下)将表单分解为多个 ajax 页面。当我单击前进到下一页时,它会跳转到表单顶部的 anchor 。这是一种不必要且不和谐的行为,我想阻止它发生。这个脚本不是我写的,不
这个问题已经有答案了: Call an absolute pointer in x86 machine code (2 个回答) 已关闭 4 年前。 我正在用 C 语言为 x86_64 linux 编
查看objdump -d ELFfile的输出,我无法区分直接和间接跳转/调用。有什么建议吗? 最佳答案 间接调用和跳转有*在指令之后和位置之前,如callq *%r13和jmpq *0x204d8a
我试图通过单击 anchor 链接来突出显示 div。我的意思是如果我点击My link 然后滚动到 here在此页面上,我有很多 anchor 链接和 div,因此很难识别哪个 div 然后滚动,因
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
没有任何编程经验,只有基本的 html/css。我正在尝试创建一个 javascript 菜单(如果有更简单的方法,可以接受建议吗?),它将根据第一个菜单中选择的选项显示/隐藏?我有以下... Q
我正在使用 jquery 的 scrollTop 函数,但无法弄清楚为什么在同一项目上多次调用时它会跳来跳去。 我把这个 example 放在一起了来说明问题。单击测试按钮时,它会交替滚动到指定的项目
我已经创建了一个关于 Storyboard的项目, Storyboard上有两个名为“loginViewController”、“BViewController”的 View Controller ,
基本上,我在网站的最顶部有一个我想隐藏的 div,当您单击一个按钮时,它会将整个网站向下推并显示其内容。与此非常相似 nd.edu (单击标题右侧的帮助中心或白杨站点)。我正在使用 jquery 来完
当我单击所单击的 div 旁边的 div 框时,我的底部 div 会上下跳跃 这是 fiddle 的链接 http://jsfiddle.net/abtPH/17/ 这是我的jquery $('li
我在悬停时调整 .main-partners div 中卡片的大小,以便出现 查看更多 按钮。 我的问题是当我 :hover 在 .main-partners 中的卡片 (.main-card) 上时
我是一名优秀的程序员,十分优秀!