异步

cai2h 2015-08-31 11:36:49
比如,我把一个方法用begininvoke执行,如果这个方法里面有这么一句语句
Thread.Sleep(1000);
这里这句话,是挂起主线程还是,挂起什么?还是挂起这个异步执行的线程?求大神解答
...全文
153 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2015-08-31
  • 打赏
  • 举报
回复
挂起当前线程
Poopaye 2015-08-31
  • 打赏
  • 举报
回复
挂起这句话所在的线程
smthgdin_020 2015-08-31
  • 打赏
  • 举报
回复
上面测试的代码已经清楚说明了。
cai2h 2015-08-31
  • 打赏
  • 举报
回复
引用 10 楼 caihh1995 的回复:
[quote=引用 6 楼 sp1234 的回复:] 异步本身,并不一定跟子线程有关。异步只是一种程序流程设计“符号化”的表示形式。异步的代码到底是在什么线程中执行,要看你的程序、操作系统等等把它最终安排到哪个线程去执行。 而你的代码,在主线程中插入了 Sleep(1000),这无论如何都是一种“坑爹”的做法。此时应该使用定时器去驱动1秒钟后的操作。.net framework的定时器(不管几种定时器中的哪一种)都是经过优化了的,即使同时有几十万个定时器,其效率也很高,它们仅仅实例化很少的对象(而不是几十万个),而且也不会去占用任何什么子线程去轮询、阻塞,它们只是在必要时才会去触发事件/回调委托而已。
我这里调用别人的sdk,有一个功能需要三步骤,创建,加载,获取.我顺序运行,获取哪里没有返回结果,断点调式是有的,后面我在加载方法后面添加一条语句Thread.Sleep(1000),运行就可以显示出来了.后面,我查了一下直接运行时可能没有执行完毕.但是这样,我获取的时候会停顿一秒;我把这三个方法封装在一个方法里面,然后异步执行,他就没有卡顿了,我搞不清楚里面的原理.(注:异步执行时去掉Thread.Sleep(1000),才能显示,去掉也没用了)[/quote] 这里错了,异步执行时,去掉Thread.Sleep(1000)就不会显示了
cai2h 2015-08-31
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
当前线程
你的意思,就是执行这个方法的线程,而不是主线程?
cai2h 2015-08-31
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
异步本身,并不一定跟子线程有关。异步只是一种程序流程设计“符号化”的表示形式。异步的代码到底是在什么线程中执行,要看你的程序、操作系统等等把它最终安排到哪个线程去执行。 而你的代码,在主线程中插入了 Sleep(1000),这无论如何都是一种“坑爹”的做法。此时应该使用定时器去驱动1秒钟后的操作。.net framework的定时器(不管几种定时器中的哪一种)都是经过优化了的,即使同时有几十万个定时器,其效率也很高,它们仅仅实例化很少的对象(而不是几十万个),而且也不会去占用任何什么子线程去轮询、阻塞,它们只是在必要时才会去触发事件/回调委托而已。
我这里调用别人的sdk,有一个功能需要三步骤,创建,加载,获取.我顺序运行,获取哪里没有返回结果,断点调式是有的,后面我在加载方法后面添加一条语句Thread.Sleep(1000),运行就可以显示出来了.后面,我查了一下直接运行时可能没有执行完毕.但是这样,我获取的时候会停顿一秒;我把这三个方法封装在一个方法里面,然后异步执行,他就没有卡顿了,我搞不清楚里面的原理.(注:异步执行时去掉Thread.Sleep(1000),才能显示,去掉也没用了)
saf分问发 2015-08-31
  • 打赏
  • 举报
回复
这特么我该听谁 的
SineMetu1 2015-08-31
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
[quote=引用 4 楼 running_crazy 的回复:]
肯定挂起异步执行的线程了,BeginInvoke后主线程就不管了.
写个代码测试下


public delegate void Dele();
private void button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(test);
t1.IsBackground = true;
t1.Start();
}

private void test()
{
Console.WriteLine("主线程1");
Console.WriteLine("主线程2");
BeginInvoke(new Dele(test1));
Console.WriteLine("主线程3");
Console.WriteLine("主线程4");
}

private void test1()
{
Console.WriteLine("异步线程挂起");
Thread.Sleep(1000);
Console.WriteLine("异步线程结束");
}

输出结果
主线程1
主线程2
主线程3
主线程4
异步线程挂起
异步线程结束


如果你在 button1_Click 中打印 Thread.CurrentThread.ManagedThreadId,然后在 Test1() 也打印,你会发现他们反映的是同一个线程。[/quote]
改进了下

public delegate void Dele();
private void button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(test);
t1.IsBackground = true;
t1.Start();
}

private void test()
{
Console.WriteLine("主线程1"+"线程标志:"+ Thread.CurrentThread.ManagedThreadId.ToString());
Console.WriteLine("主线程2");
BeginInvoke(new Dele(test1));
Console.WriteLine("主线程3");
Console.WriteLine("主线程4" + "线程标志:" + Thread.CurrentThread.ManagedThreadId.ToString());
}

private void test1()
{
Console.WriteLine("异步线程挂起" + "线程标志:" + Thread.CurrentThread.ManagedThreadId.ToString());
Thread.Sleep(1000);
Console.WriteLine("异步线程结束" + "线程标志:" + Thread.CurrentThread.ManagedThreadId.ToString());
}

  • 打赏
  • 举报
回复
引用 4 楼 running_crazy 的回复:
肯定挂起异步执行的线程了,BeginInvoke后主线程就不管了. 写个代码测试下


         public delegate void Dele();
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(test);
             t1.IsBackground = true;
             t1.Start();
        }

       private void test()
       {
            Console.WriteLine("主线程1");
            Console.WriteLine("主线程2");
            BeginInvoke(new Dele(test1));
            Console.WriteLine("主线程3");
            Console.WriteLine("主线程4");
       }

        private void test1()
        {
            Console.WriteLine("异步线程挂起");
            Thread.Sleep(1000);
            Console.WriteLine("异步线程结束");
        }
输出结果 主线程1 主线程2 主线程3 主线程4 异步线程挂起 异步线程结束
如果你在 button1_Click 中打印 Thread.CurrentThread.ManagedThreadId,然后在 Test1() 也打印,你会发现他们反映的是同一个线程。
  • 打赏
  • 举报
回复
异步本身,并不一定跟子线程有关。异步只是一种程序流程设计“符号化”的表示形式。异步的代码到底是在什么线程中执行,要看你的程序、操作系统等等把它最终安排到哪个线程去执行。 而你的代码,在主线程中插入了 Sleep(1000),这无论如何都是一种“坑爹”的做法。此时应该使用定时器去驱动1秒钟后的操作。.net framework的定时器(不管几种定时器中的哪一种)都是经过优化了的,即使同时有几十万个定时器,其效率也很高,它们仅仅实例化很少的对象(而不是几十万个),而且也不会去占用任何什么子线程去轮询、阻塞,它们只是在必要时才会去触发事件/回调委托而已。
  • 打赏
  • 举报
回复
主线程。 基本上,你应该养成一个习惯,对于随随便便地“阻塞”的逻辑设计应该尽量避免。这种阻塞1秒钟的代码,更多地是在20年前的unix/linux系列的多进程编程程序范例中才会出现,或者在近些年的不靠谱的java教科书中才会滥用。 windows系统是比unix系列优秀得多的操作系统(只不过它有爆炸般巨大的UI 桌面运行需求,所以才对那些不懂得这个特点人看来显得有时候稍慢),它从几十年前就是以多线程为重点的,而不是针对那种只知道多进程(每个进程几乎都是单线程)的程序。因此在windows下编程,去抄30年前的unix的编程教科书、或者10年前的java的编程教科书,都会受到毒害。因为那些教科书根本不懂如何进行高性能、高并发的异步编程设计。
SineMetu1 2015-08-31
  • 打赏
  • 举报
回复
肯定挂起异步执行的线程了,BeginInvoke后主线程就不管了. 写个代码测试下


         public delegate void Dele();
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(test);
             t1.IsBackground = true;
             t1.Start();
        }

       private void test()
       {
            Console.WriteLine("主线程1");
            Console.WriteLine("主线程2");
            BeginInvoke(new Dele(test1));
            Console.WriteLine("主线程3");
            Console.WriteLine("主线程4");
       }

        private void test1()
        {
            Console.WriteLine("异步线程挂起");
            Thread.Sleep(1000);
            Console.WriteLine("异步线程结束");
        }
输出结果 主线程1 主线程2 主线程3 主线程4 异步线程挂起 异步线程结束
exception92 2015-08-31
  • 打赏
  • 举报
回复
当前线程

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧