主线程等待子线程结果过程中,怎么即处于等待状态,又不阻塞主线程继续响应其他消息?请高手支招,

主线程等待子线程结果过程中,如何即处于等待状态,又不阻塞主线程继续响应其他消息?请高手支招,在线等..........
有一个界面按钮事件A,要求实现以下功能:
1、等待子线程执行结束,得到结果后继续执行,这个不难
2、在等待子线程的过程中,要能继续响应界面上其他按钮的点击事件(这个不会)
A事件的响应函数如何写?请高手支招
VC++可以实现这个功能,但C#下不会
------解决思路----------------------
放到BackgroundWorker里去执行,执行完有回调函数,通知主线程继续执行其他代码.
------解决思路----------------------
完整代码,你可以测下看。空窗体拖两个button上来,分别双击生成事件,然后把代码复制进去就好


using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        CancellationTokenSource uploadCancellationTokenSource;
        public Form1() { InitializeComponent(); }

        string 传输数据()
        {
            //3、数据传输结束后,还要等待服务器返回操作结果(不定时);
            //怎么传数据你写在这里。。。我就写个延时拉倒了

            for (var i = 0; i < 20; i++)
            {
                Thread.Sleep(100);

                if (uploadCancellationTokenSource.IsCancellationRequested)
                {
                    return "N";
                }
            }

            return "M";
        }

        async void button1_Click(object sender, EventArgs e)
        {
            //1、点击按钮A,启动一个后台线程P,向服务器传输数据;
            uploadCancellationTokenSource = new CancellationTokenSource();

            //4、在事件A的处理函数中,要得到处理结果C(如果用户没有点击B,返回M,点击了返回N)
            MessageBox.Show(await Task.Run((Func<string>)传输数据, uploadCancellationTokenSource.Token));
        }

        void button2_Click(object sender, EventArgs e)
        {
            //2、在数据传输过程中,用户可以随时点击B,撤销当前业务;
            uploadCancellationTokenSource.Cancel();
        }
    }
}