C#中异步和多线程的区别介绍(一)与异步

C#中异步和多线程的区别介绍

一、区别与联系

异步和多线程有什么区别?其实异步是目的,多线程是实现的方式。异步是指A发起操作后(通常是耗时的操作,如果操作不耗时,则不需要异步),无需等待就可以继续处理自己的事务。耗时的操作返回。 .Net 中的这种异步编程模型简化了多线程编程。我们甚至可以在不关心 Thread 类的情况下进行异步操作。

异步有时使用普通线程,有时使用系统的异步调用函数。一些 IO 操作也是异步的,但不一定需要线程来运行。例如,硬件具有 DMA 功能。调用DMA传输数据时,CPU不需要进行处理。它只需要发起传输并等待传输结束。具体到.net平台,比如Socket的BeginSend,如果是Windows 2000之后的平台,会在底层调用异步完成端口发送。

.Net 中的异步执行实际上使用异步委托。异步委托将要执行的方法提交给.NET的线程池线程标识符 有什么用,线程池中的线程执行异步方法。

二、作用域三、异步的一个例子

您可能知道,使用委托可以“自动”使方法可异步调用。直觉上,我认为编译器或 CLR 使用另一个线程来执行目标方法。是这样吗? 让我们用一段代码来证明。

delegate void AsyncFoo(int i);
static void Main(string[] args)
{
    PrintCurrThreadInfo("Main()");
    for (int i = 0; i < 10; i++)
    {
        PostAsync();
    }
    Console.ReadLine();
}
///
/// 输出当前线程的信息
///
///方法名称
static void PrintCurrThreadInfo(string name)
{
    Console.WriteLine("Thread Id of " + name + " is: " + Thread.CurrentThread.ManagedThreadId + ", current thread is "
             + (Thread.CurrentThread.IsThreadPoolThread ? "" : "not ")
             + "thread pool thread.");
}
///
/// 投递一个异步调用
///
static void PostAsync()
{
    AsyncFoo caller = new AsyncFoo(Foo);
    caller.BeginInvoke(1000, new AsyncCallback(FooCallBack), caller);
}
///
/// 测试方法,Sleep一定时间
///
///Sleep的时间
static void Foo(int i)
{
    PrintCurrThreadInfo("Foo()");
    Thread.Sleep(i);
}
static void FooCallBack(IAsyncResult ar)
{
    PrintCurrThreadInfo("FooCallBack()");
    AsyncFoo caller = (AsyncFoo)ar.AsyncState;
    caller.EndInvoke(ar);
}

这段代码的输出如下:

Thread Id of Main() is: 1, current thread is not thread pool thread.
Thread Id of Foo() is: 3, current thread is thread pool thread.
Thread Id of FooCallBack() is: 3, current thread is thread pool thread.
Thread Id of Foo() is: 3, current thread is thread pool thread.
Thread Id of Foo() is: 4, current thread is thread pool thread.
Thread Id of Foo() is: 5, current thread is thread pool thread.
Thread Id of FooCallBack() is: 3, current thread is thread pool thread.
Thread Id of Foo() is: 3, current thread is thread pool thread.
Thread Id of FooCallBack() is: 4, current thread is thread pool thread.
Thread Id of Foo() is: 4, current thread is thread pool thread.
Thread Id of Foo() is: 6, current thread is thread pool thread.
Thread Id of FooCallBack() is: 5, current thread is thread pool thread.
Thread Id of Foo() is: 5, current thread is thread pool thread.
Thread Id of Foo() is: 7, current thread is thread pool thread.
Thread Id of FooCallBack() is: 3, current thread is thread pool thread.
Thread Id of Foo() is: 3, current thread is thread pool thread.
Thread Id of FooCallBack() is: 4, current thread is thread pool thread.
Thread Id of FooCallBack() is: 6, current thread is thread pool thread.
Thread Id of FooCallBack() is: 5, current thread is thread pool thread.
Thread Id of FooCallBack() is: 7, current thread is thread pool thread.
Thread Id of FooCallBack() is: 3, current thread is thread pool thread.

从输出Out可以看出,.net使用委托来“自动”生成使用另一个线程(和线程池线程)的异步调用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

时间:2022-05-10

详解C#多线程和异步的区别

详解C#多线程和异步的区别随着硬线程CPU(超线程。双核)的流行,多线程和异步操作等并发编程方法也受到了更多的关注和讨论。本文主要想和各位高手讨论如何利用并发来最大化程序。表现。多线程和异步操作的异同 多线程和异步操作都可以达到避免调用线程阻塞的目的,从而提高软件的响应能力。有时我们甚至认为多线程和异步操作是等价的概念。但是,多线程和异步操作之间存在一些差异。这些差异导致使用多线程和异步操作的时序不同。异步操作的本质所有程序最终都由计算机硬件处理

C&num ;异步多线程简介

目录process.Thread1.Process2.线程分时.Shard同步.Asynchronous异步.Multithreading异步多线程效率多线程无序扩展异步多线程版下一篇:C#异步多线程介绍精通线程进程。 Thread1. Process 首先了解一下,什么是线程?也就是一个应用程序在运行时,占用资源的综合就是一个进程。您可以在 Windows 任务管理器中看到它们中的每一个都是一个正在运行的进程。 2. 线程线程是执行流的最小单位。线程其实是不可见的 是的,其实也是可以的,比如Windows任务管理器:272个进程在运行,272个进程在运行

C#异步接口的多线程实现

异步接口声明我们已经了解到,如果一个方法是异步的,那么这个方法的返回值类型就是Task,那么在接口中应该如何指定异步方法呢?同理,如果接口中的接口方法是异步的,那么方法的返回值类型指定为Task,见如下代码: interface ITest { /// /// 方法的返回类型为Task / // /// 任务

分析异步多线程的实现以及C#中线程池的使用多线程编程

0.线程的本质是线程不是计算机硬件,而是操作系统提供的逻辑功能。线程本质上是在一个进程中并发运行的一段代码,所以一个线程需要操作系统投入CPU资源来运行和调度。 1.多线程:使用多个Handling句柄同时控制多个任务的一种处理技术。按照博主的理解,多线程就是应用程序的主线程指定多个其他线程来辅助它完成需要的功能,主线程和辅助线程是完全独立的。不知道这样说是不是很容易理解,以后在使用中会更详细的解释。 2.多线程使用:(1)最简单。最原始的使用方法:线程oGetArgThre

C#使用中常见问题详解异步多线程

图片[1]-C#中异步和多线程的区别介绍(一)与异步-老王博客

目录异常处理线程取消临时变量线程安全异常处理你有没有想过多线程如何处理同步方法的异常,同步方法中的异常处理,一定很熟悉。什么是多线程?然后我将解释多线程的异常处理。首先我们定义一个任务列表,当11.12次时,抛出异常,最外层使用try catch包裹 static void Main(string[] args) { Console.WriteLine($”Main Start, ThreadId:{Thread.CurrentThread.Manage

深入解析C#中的异步和多线程

许多开发人员对异步代码和多线程、它们如何工作以及如何使用它们有错误的想法。在这里,您将了解概念之间的差异并使用 c# 实现它们。我:“服务员,这是我第一次来这家餐厅,通常需要4个小时才能拿到食物吗?”服务员:“哦,是的,先生。这家餐厅的厨房里只有一位厨师。”我:“——只有一个厨师吗?”服务员:“是的,先生,我们有好几位厨师,但每次只有一位在厨房工作。”我:“所以其他 10 个人穿着厨师服站在厨房里 – 什么

分享我个人对异步和多线程关系的理解

个人理解是这样的:1.异步通信是指A发送消息后,不等待B的响应,继续执行后续程序。在未来的某个时刻,A会检查是否收到了B的响应。异步是相互独立的,在等待事件的过程中继续做自己的事情线程标识符 有什么用,不需要等待在工作之前完成的事件。 2. 多线程是编程的逻辑层概念,它是一段代码在进程中并发运行。更多线程可以实现线程之间的切换执行。 3. 异步和同步是相对的。同步是顺序执行。执行完一个再执行下一个,需要等待。协调操作。线程是一种实现异步的方式。异步就是让调用方法的主线程不需要同步等待另一个线程

深入解析python中的多进程、多线程、协程

进程和线程的历史我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担着计算机的所有任务。操作系统是运行在硬件上的软件,是计算机的管理者。它负责资源的管理和分配。任务的调度。程序是在系统上运行的具有一定功能的软件,例如浏览器、音乐播放器等。程序每执行一次,都会完成一定的功能。例如,浏览器帮助我们打开网页。为了保证其独立性,需要专门的管理和控制程序数据。结构——过程控制块。进程是程序在数据集上的动态执行过程。进程一般由program.dataset.process控制

.NET Core Steps中使用异步编程方式

我最近受到异步和多线程编程的启发,所以我决定写下我的理解。思考:为什么要使用异步编程?我们先看一下程序中执行前的同步方法和异步方法逻辑: 1. 同步方法 static void Main(string[] args) { Console.WriteLine($”{DateTime.Now.ToString(“yyyy-MM) -dd HH:mm:ss ms”)}:开始”); // 调用同步方法 SyncTestMethod(); Console.WriteL

javascript中的异步实例分析

js异步分析 one.js单线程分析 大家都知道js最大的特点就是单线程,也就是同时只能处理一件事,一句话js代码。那么为什么js设计成单线程而不是多线程呢?这主要和js的使用有关。 js作为浏览器端脚本语言的主要用途是用户与服务器的交互以及dom的运行。 dom的操作意味着js只能是单线程语言。如果js只取多线程,就会出现,多个线程同时操作一个dom。在这种情况下,浏览器将无法判断如何渲染。不仅js​​是单线程的,浏览器渲染dom也是单线程的,js的执行和浏览器渲染dom共用一个线程,导致h

Servlet 3.0/3.1中异步处理详解

在Servlet3.0之前,Servlet采用了Thread-Per-Request的方式来处理请求,即每个Http请求从头到尾由某个线程发送到尾部负责处理如果一个请求需要IO操作,比如访问数据库,调用第三方服务接口等,对应的线程会同步等待IO操作完成,IO操作很慢,所以线程在这时候就无法及时释放回线程池以供后续使用。在增加并发的情况下,这会带来严重的性能问题。即便是像 Spring.Struts 这样的高级框架也无法摆脱这样的桎梏。因为它们都是建立在 Servlet 之上的。

Java Web项目中使用Socket通信多线程长连接的方法

在javaweb项目中很多时候我们需要使用Socket通信来实现功能,要在web中使用Socket,我们需要创建一个监听程序,当程序启动时,启动socket监听。我们的应用场景是在java项目中,我们需要连接一个外部的硬件设备,通过tcp进行通信,得到设备传输的数据上来并响应数据。我们先看web的监控代码:import javax.servlet.ServletContextEvent;导入 javax.servlet.ServletContextListener;公开课

Android中ListView异步加载图片错位重复,闪烁问题分析及解决方法

Android ListView 异步加载图片到错误位置。重复。频闪分析及解决方案,具体问题分析及解决方案请看下文。当我们使用ListView异步加载图片时,在快速滑动或者网络不好的情况下,会出现图片错位、重复、闪烁等问题,其实这些问题总结为一个问题,我们需要针对这些问题优化 ListView。比如ListView上有100个item,一屏只显示10个Item。我们知道getView()中的convertView是用来复用View对象的,因为一个Item对应一个View对象,而Ima

关于Jquery中Ajax异步请求中async参数的作用

之前不知道这个参数的作用。在网上找到前人的博客,收录在自己的博客中,希望对更多的朋友有所帮助:test.html asy.js function testAsync { var temp; $.ajax({ async: false, type : “GET”, url : ‘tet.php’, complete: functi

解决OneThink无法在kindeditor文本框中异步提交修改内容方法

最近在使用OneThink自带的kindeditor编辑器时,草稿被保存了。有时,输入内容不能总是保存到后台。通过分析下图所示的URL,发现原来的内容值是空的,并且有值,为什么是空的呢?但是如果没有异步提交表单,则可以获取输入值。起初,kindeditor一直被认为是ajax的问题​​。最后查阅资料,发现是kindeditor的问题。因为异步提交数据时,kindeditor中输入的值并没有同步到对应的文本框。正确的。方法是,当kindeditor失去焦点时,这样做

我们来谈谈 Javascript 中的异步以及如何异步

为什么需要异步?为什么?看一段代码。问题一:for (var i=0;i

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论