Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在标记帮助器中强制ASP.NET Core ProcessAsync中的线程更改_C#_Asp.net Core_Async Await_Tag Helpers - Fatal编程技术网

C# 如何在标记帮助器中强制ASP.NET Core ProcessAsync中的线程更改

C# 如何在标记帮助器中强制ASP.NET Core ProcessAsync中的线程更改,c#,asp.net-core,async-await,tag-helpers,C#,Asp.net Core,Async Await,Tag Helpers,我试图将一个演示放在一起,展示ProcessAsync将当前运行的ASP.NET Web服务器线程池的工作移开。我写了一个简短的例子,称之为天气服务。不幸的是,threadId没有改变 我的理解是,可能不会。因此,有两个问题: 1:我这样做是否正确?我是否应该期望ThreadIdBefore和ThreadIdAfter应该/可能不同 2:假设我做得正确,我能做些什么让演示显示一个新的threadId吗 namespace WebAppTagHelper.TagHelpers { publ

我试图将一个演示放在一起,展示ProcessAsync将当前运行的ASP.NET Web服务器线程池的工作移开。我写了一个简短的例子,称之为天气服务。不幸的是,threadId没有改变

我的理解是,可能不会。因此,有两个问题:

1:我这样做是否正确?我是否应该期望ThreadIdBefore和ThreadIdAfter应该/可能不同

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));

                }

            }

        }
    }

}
命名空间WebAppTagHelper.TagHelpers
{
公共类MyTestTagHelper:TagHelper
{
私有静态HttpClient _HttpClient=新HttpClient();
字符串requestUrl=”http://samples.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=b1b15e88fa797225412429c1c50c122a1";
公共重写异步任务ProcessAsync(
TagHelperContext上下文,TagHelperOutput输出)
{
var threadIdBefore=Thread.CurrentThread.ManagedThreadId;
var uri=新uri(requestUrl);
使用(var response=await_httpClient.GetAsync(uri))
{
response.EnsureSuccessStatusCode();
var result=await response.Content.ReadAsStringAsync();
JObject json=JObject.Parse(结果);
如果(结果!=null)
{
添加(“类”、“突出显示”);
var threadIdAfter=Thread.CurrentThread.ManagedThreadId;
output.Content.SetHtmlContent(
Format(“Thread ID Before:{0}After:{1}”,threadIdBefore,threadIdAfter));
}
}
}
}
}
我这样做是否正确?我是否应该期望ThreadIdBefore和ThreadIdAfter应该/可能不同


否。在“之前”和“之后”之间没有
wait
,因此线程不可能更改。

异步方法将继续在第一个可用线程上执行,在您的情况下,第一个线程恰好相同。您可以通过同时发送多个请求来实现这一点。谢谢@stephen cleary,祝您好运。我已经修复了源代码,但仍然得到了相同的threadId。除了
Task.Run
,还有什么直接的方法可以将它强制到你能想到的新线程上吗?你为什么要这么做?只是为了教书。如何显示异步工作发生在活动web线程池之外的线程上。@Evk帮助我学习。请让我知道你看到了什么,清楚地表明我不明白。@PeterKellner:我有一个和一个可以帮助你。