如何在 Tag Helper 的 ASP.NET Core ProcessAsync 中强制更改线程
How To Force Thread Change in ASP.NET Core ProcessAsync in Tag Helper
我正在尝试将一个演示放在一起,以展示 ProcessAsync 将工作移出当前 运行 ASP.NET Web 服务器线程池。我写了一个调用天气服务的简短示例。不幸的是 threadId 没有改变。
我的理解是可能不会。所以,两个问题:
1:我这样做是否正确,我是否应该期望 ThreadIdBefore 和 ThreadIdAfter should/might 不同?
2:假设我这样做是正确的,我可以做些什么来让演示显示新的 threadId 吗?
namespace WebAppTagHelper.TagHelpers
{
public class MyTestTagHelper : TagHelper
{
private static HttpClient _httpClient = new HttpClient();
string requestUrl = "http://samples.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=b1b15e88fa797225412429c1c50c122a1";
public override async Task ProcessAsync(
TagHelperContext context, TagHelperOutput output)
{
var threadIdBefore = Thread.CurrentThread.ManagedThreadId;
var uri = new Uri(requestUrl);
using (var response = await _httpClient.GetAsync(uri))
{
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
JObject json = JObject.Parse(result);
if (result != null)
{
output.Attributes.Add("class", "highlight");
var threadIdAfter = Thread.CurrentThread.ManagedThreadId;
output.Content.SetHtmlContent(
string.Format("<b>Thread ID Before: {0} After: {1}</b>", threadIdBefore, threadIdAfter));
}
}
}
}
}
Am I doing this correctly and should I expect that ThreadIdBefore and ThreadIdAfter should/might be different?
没有。 "before" 和 "after" 之间没有 await
,所以不可能换线程。
我正在尝试将一个演示放在一起,以展示 ProcessAsync 将工作移出当前 运行 ASP.NET Web 服务器线程池。我写了一个调用天气服务的简短示例。不幸的是 threadId 没有改变。
我的理解是可能不会。所以,两个问题:
1:我这样做是否正确,我是否应该期望 ThreadIdBefore 和 ThreadIdAfter should/might 不同?
2:假设我这样做是正确的,我可以做些什么来让演示显示新的 threadId 吗?
namespace WebAppTagHelper.TagHelpers
{
public class MyTestTagHelper : TagHelper
{
private static HttpClient _httpClient = new HttpClient();
string requestUrl = "http://samples.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=b1b15e88fa797225412429c1c50c122a1";
public override async Task ProcessAsync(
TagHelperContext context, TagHelperOutput output)
{
var threadIdBefore = Thread.CurrentThread.ManagedThreadId;
var uri = new Uri(requestUrl);
using (var response = await _httpClient.GetAsync(uri))
{
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
JObject json = JObject.Parse(result);
if (result != null)
{
output.Attributes.Add("class", "highlight");
var threadIdAfter = Thread.CurrentThread.ManagedThreadId;
output.Content.SetHtmlContent(
string.Format("<b>Thread ID Before: {0} After: {1}</b>", threadIdBefore, threadIdAfter));
}
}
}
}
}
Am I doing this correctly and should I expect that ThreadIdBefore and ThreadIdAfter should/might be different?
没有。 "before" 和 "after" 之间没有 await
,所以不可能换线程。