首页 > 多线程和异步有什么区别?C#中如何在单线程中异步?

多线程和异步有什么区别?C#中如何在单线程中异步?

说明一下,或者代码示例一下。


首先明确一点,多线程和异步当然是有关系的。

首先来看一下同步的单线程:

static void Main(string[] args)
{
    for (int i = 0; i < 10; i++)
    {
        Console.Write(1);
        Thread.Sleep(100);
    }

    for (int i = 0; i < 10; i++)
    {
        Console.Write(2);
        Thread.Sleep(100);
    }

    Console.Read();
}

输出结果是:

11111111112222222222

两个for循环依次被主线程执行,这便是同步的表现形式。

假设:

第一个for循环执行一个非常耗时的操作,比如:数据库操纵、读写文件等。那么第二个for循环就要持续等待第一个完成之后再执行。如果,我想要在第一个for循环执行的过程中,保证第二个for循环也能同时执行,以达到比如不会导致窗体假死等效果,正如操作系统根据时间片切换不同进程是同一个道理。那么,如果才能做到呢?加一个线程进来,实现异步操作。

static void Main(string[] args)
{
    Thread t = new Thread(x =>
    {
        for (int i = 0; i < 10; i++)
        {
            Console.Write(1);
            Thread.Sleep(100);
        }
    });
    t.Start();  

    for (int i = 0; i < 10; i++)
    {
        Console.Write(2);
        Thread.Sleep(100);
    }

    Console.Read();
}

此时的执行结果,像是两个for循环同时执行,这边是多线程实现的异步操作。

21211212122112212112

关于单线程实现异步C#中可以使用委托异步操作,不用单独定义Thread,但归根结底委托也是重新开启了一个线程池线程实现异步。

以上仅是个人理解,仅供参考。


首先说明,笔者没有复杂的多线程程序设计和实现经验。只是按照平时接触到的知识尝试给出一个自己的理解,大多是概念性的东西(概念不理解学习起来是不会有正确的方向的),仅供楼主参考,有不同意见的大哥们欢迎指出问题。

1.多线程和异步不是一个面儿上定义的概念,同步方法(阻塞方法)和异步方法、单线程和多线程才有可比性。所以更说不上什么多线程和异步的区别了。

2.多线程技术是实现异步程序的方式,单线程程序是无法实现异步方法调用的(所以第二个问题是伪命题,无解)。

关于多线程和异步方法调用的实现简易楼主可以有目的的接触一些多线程编程的知识,应该有专门针对多线程的书籍和资源。听有经验的同志说,复杂的多线程技术很不好写,尤其是保证其稳定性的前提下。


  1. 多线程(这个有什么好解释的),随便一本计算机系统的书或者编程的书里应该都会解释一大堆吧
  2. 异步:有一种叫做Functional reactive programming的东西应该能帮助你去理解,我所接触的是ReactiveCocoa和rxjava,netflix有C#的实现,所以你应该可以找到,默认情况下其实这些方法都是在一个线程里去执行的,当一个事件产生的时候,就会触发订阅了这个事件的方法,而不是需要执行的方法等在那里去等这个事件产生
  3. 代码就不写了,找到netflix的实现以后,文档里sample代码一大堆
【热门文章】
【热门文章】