代码人生的小狗窝

一行行枯燥的代码,却描绘出人生的点点滴滴

您现在的位置是:首页>_C#

使用了异步调用和没使用一样界面没反应.为什么,该如何处理

发布时间:2019-12-10浏览(2246)

    使用了异步调用和没使用一样界面没反应.为什么
    button1_Click没有使用异步.运行时界面会卡10秒.button2_Click使用了异步.界面一样卡10秒.谁能解答一下为什么吗?异步不是在另一个线程中执行的吗?

    C# code
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    namespace bar4
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private delegate int myde(int a);
    
            private void button1_Click(object sender, EventArgs e)
            {
                myde my = new myde(mymethod);
               textBox1.Text= my(1000).ToString();
            }
            private int mymethod(int s)
            {
                Thread.Sleep(10000);
                return s * s;
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                myde my = new myde(mymethod);
                IAsyncResult async=my.BeginInvoke(5,null,null);
                int result = my.EndInvoke(async);
                textBox1.Text = result.ToString();
                //this.Invoke(my, new Object[] { 1000 });
                
            }
        }
    }
    
    


    ------解决方案--------------------
    原因很简单你,你又begin又end当然它等于是没有异步了

    想法于立即调用Join()一样,他会让当前线程阻塞,直到调用后果新返回
    到当前线程为止
    ------解决方案--------------------
    你这样不叫异步啊,异步是另开一个线程,独立于主线程运行。
    http://blog.csdn.net/lanwilliam/archive/2008/05/05/2390939.aspx
    ------解决方案--------------------
    楼主是使用委托来做的标准异步操作.

    你把End的拿起走,注意到你写的参数用了两个null其中前一个就是一个

    委托你在这个委托中调用End的方法一切就OK.

    ------解决方案--------------------
    开线程吧
    C# code
    
    Thread _threadShow = new Thread();
    if(_threadShow != null && _threadShow.ThreadState == ThreadState.Running)
    {
     return;
    }
    _threadShow = new Thread(new ThreadStart(mymethod));
    _threadShow.Start();