button1_Click没有使用异步.运行时界面会卡10秒.button2_Click使用了异步.界面一样卡10秒.谁能解答一下为什么吗?异步不是在另一个线程中执行的吗?
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 });
            
        }
    }
}

解决方案 »

  1.   

    卡: int result = my.EndInvoke(async);
      

  2.   

    int result = my.EndInvoke(async);
    可你主线程停在那等结果阿。
      

  3.   

    IAsyncResult async=my.BeginInvoke(5,null,null);
                int result = my.EndInvoke(async);
    这边可以使用回调函数取返回的结果值
      

  4.   

    原因很简单你,你又begin又end当然它等于是没有异步了想法于立即调用Join()一样,他会让当前线程阻塞,直到调用后果新返回
    到当前线程为止
      

  5.   

    你这样不叫异步啊,异步是另开一个线程,独立于主线程运行。
    http://blog.csdn.net/lanwilliam/archive/2008/05/05/2390939.aspx
      

  6.   

    楼主是使用委托来做的标准异步操作.你把End的拿起走,注意到你写的参数用了两个null其中前一个就是一个委托你在这个委托中调用End的方法一切就OK.
      

  7.   

    开线程吧Thread _threadShow = new Thread();
    if(_threadShow != null && _threadShow.ThreadState == ThreadState.Running)
    {
     return;
    }
    _threadShow = new Thread(new ThreadStart(mymethod));
    _threadShow.Start();