>

美洲杯在线投注_2019美洲杯外围投注[投注官网]

热门关键词: 美洲杯在线投注,2019美洲杯外围投注[投注官网]

ASP.NET sync over async(异步中同步,什么鬼?)

- 编辑:美洲杯在线投注 -

ASP.NET sync over async(异步中同步,什么鬼?)

线程的直接调用:

async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的,包含数据库访问异步、网络访问异步、服务调用异步等等,那么恭喜你,你的应用程序是没问题的,但有一种情况是,你的应用程序代码比较老,是同步的,但现在你需要调用异步代码,这该怎么办呢?有人可能会说,很简单啊,不是有个 .Result 吗?但事实真的就这么简单吗?我们来探究下。

import threading   #直接调用
def run2(n):      #函数名可以随便起
    n = '吞噬者'
    print('rhread %s is start'% n)
t = threading.Thread(target=run2,args='n')   #生成一个线程实例
t.start()

首先,放出几篇经典文章:

 

  • async & await 的前世今生
  • 异步编程 In .NET(中文资料中,写异步最棒的两篇文章美洲杯在线投注,)
  • HttpClient.GetAsync never returns when using await/async
  • Don't Block on Async Code(下面测试中的第三种情况
  • Should I expose synchronous wrappers for asynchronous methods?(sync over async 透彻

线程的继承式调用:

上面文章的内容,我们后面会说。光看不练假把式,所以,如果真正要体会 sync over async,我们还需要自己动手进行测试:

import threading      #继承式调用
class Mythreading(threading.Thread):
    def __init__(self,n):
        super(Mythreading,self).__init__()    #重写构造方法,继承基类
        self.n = n
    def run(self):              #函数名必须是 run
        print('线程 %s 已启动' % self.n)
t = Mythreading('吞噬者')
t.run()
  • 1. 异步调用使用 .Result,同步调用使用 .Result
  • 2. 异步调用使用 await,同步调用使用 Task.Run
  • 3. 异步调用使用 await,同步调用使用 .Result
  • 4. 异步调用使用 Task.Run,同步调用使用 .Result
  • 5. 异步调用使用 await .ConfigureAwait,同步调用使用 .Result
  • 6. 异步调用使用 await .ConfigureAwait,同步调用使用 .Result
  • 7. 异步调用使用 await,异步调用使用 await
  • 8. 测试总结

 

先说明一下,在测试代码中,异步调用使用的是 HttpClient.GetAsync 方法,并且测试请求执行两次,关于具体的分析,后面再进行说明。

锁:

1. 异步调用使用 .Result,同步调用使用 .Result

测试代码:

[Route("")][HttpGet]public string Index(){    System.Diagnostics.Debug.WriteLine("Thread.CurrentThread.ManagedThreadId1:"   Thread.CurrentThread.ManagedThreadId);    var result = Test();    System.Diagnostics.Debug.WriteLine("Thread.CurrentThread.ManagedThreadId4:"   Thread.CurrentThread.ManagedThreadId);    return result;}public static string Test(){    System.Diagnostics.Debug.WriteLine("Thread.CurrentThread.ManagedThreadId2:"   Thread.CurrentThread.ManagedThreadId);    using (var client = new HttpClient    {        var response = client.GetAsync.Result;        System.Diagnostics.Debug.WriteLine("Thread.CurrentThread.ManagedThreadId3:"   Thread.CurrentThread.ManagedThreadId);        return response.Content.ReadAsStringAsync().Result;    }}

输出结果:

Thread.CurrentThread.ManagedThreadId1:13Thread.CurrentThread.ManagedThreadId2:13Thread.CurrentThread.ManagedThreadId3:13Thread.CurrentThread.ManagedThreadId4:13Thread.CurrentThread.ManagedThreadId1:6Thread.CurrentThread.ManagedThreadId2:6Thread.CurrentThread.ManagedThreadId3:6Thread.CurrentThread.ManagedThreadId4:6

简单总结:同步代码中调用异步,上面的测试代码应该是我们最常写的,为什么没有出现线程阻塞,页面卡死的情况呢?而且代码中调用了 GetAsync,为什么请求线程只有一个?后面再说,我们接着测试。

本文由计算机教程发布,转载请注明来源:ASP.NET sync over async(异步中同步,什么鬼?)