当前位置: 代码迷 >> C# >> 如何修改
  详细解决方案

如何修改

热度:230   发布时间:2016-04-28 08:39:40.0
怎么修改

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;

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

        private void button1_Click(object sender, EventArgs e)
        {
            Task[] a = new Task[12];

            for (int i = 0; i < 12; i++)
            {
                a[i] = new Task(MGo, i.ToString());
                a[i].Start();
            }

            //Task.WaitAll(a);
            //MessageBox.Show("OK");
        }

        private void MGo(object obj)
        {
            while (true)
            {
                CrossThreadCalls.SafeInvoke(this.label1, new CrossThreadCalls.TaskDelegate(delegate()
                {
                    listBox1.Items.Add(DateTime.Now.Ticks.ToString());
                }));
                Thread.Sleep(1000);
            }
        }


    }


    public static class CrossThreadCalls
    {
        public delegate void TaskDelegate();
        private delegate void InvokeMethodDelegate(Control control, TaskDelegate handler);

        //CrossThreadCalls.SafeInvoke(this.label1, new CrossThreadCalls.TaskDelegate(delegate()
        //{
        //    listBox1.Items.Add(DateTime.Now.Ticks.ToString());
        //}));

        public static void SafeInvoke(Control control, TaskDelegate handler)
        {
            if (control.InvokeRequired)
            {
                while (!control.IsHandleCreated)
                {
                    if (control.Disposing || control.IsDisposed)
                        return;
                }
                IAsyncResult result = control.BeginInvoke(new InvokeMethodDelegate(SafeInvoke), new object[] { control, handler });
                control.EndInvoke(result);
                return;
            }
            IAsyncResult result2 = control.BeginInvoke(handler);
            control.EndInvoke(result2);
        }
    }
}


根据http://www.cnblogs.com/slyzly/articles/2121436.html 此人的代码写的,但是发现只要执行了Task.WaitAll(a);程序就一直卡死在那里不显示输出了,why?  怎么改?
------解决思路----------------------
引用:
...
1:线程是死循环没错,但是应该显示出来啊,可是1行都不显示
2:就算线程里去掉while,一样卡死什么也不显示

各位同学,能仔细点么


所谓的"显示出来",需要代码执行对不?
而一旦WaitAll了,UI线程就停在那里了,哪来的线程去执行“显示出来”?
  相关解决方案