线程更新GUI在随机时刻冻结

时间:2014-09-22 10:50:49

标签: c# multithreading winforms

我有按钮和文本框的表单。按钮正在启动正在更新文本框值的线程。

    public Form1()
    {
        InitializeComponent();
        myDelegate = new UpdateUi(updateUi);
    }
    private void button1_Click(object sender, EventArgs e)
    {
        myThread = new Thread(new ThreadStart(ThreadFunction));
        myThread.Start();
    }
    private void ThreadFunction()
    {
        MyThreadClass myThreadClassObject  = new MyThreadClass(this);
        myThreadClassObject.Run();
    }
    private void updateUi(int i)
    {
        textBox1.Text = i.ToString();
        Thread.Sleep(1000);
    }
    public Thread myThread;
    public delegate void UpdateUi(int i);
    public UpdateUi myDelegate;

和ThreadClass:

public class MyThreadClass
{
    Form1 myFormControl1;
    public MyThreadClass(Form1 myForm)
    {
        myFormControl1 = myForm;
    }

    public void Run()
    {
        // Execute the specified delegate on the thread that owns
        // 'myFormControl1' control's underlying window handle.
        for(int i=0;i<100;i++)
        {
            if(myFormControl1.InvokeRequired)
            {
                myFormControl1.Invoke(myFormControl1.myDelegate,i);
            }

        }


    }
}

正如您所看到的,我的代码中没有任何特殊内容,但有时会冻结代码。

例如,它是1-> 2-> 3->冻结 - > 16-> 17,依此类推。

我从HERE获取代码而几乎没有修改

1 个答案:

答案 0 :(得分:1)

问题是你是在推迟UI线程而不是进程本身,所以会发生什么是你发出所有更新命令但由于它都在同一个线程上运行它会被阻塞,因为Thread.Sleep会阻止UI线程所以它会运行一堆textBox1.Text = i.ToString();然后它会在所有Thread.Sleep(1000);的所有时间停止,可能是1&gt; 2-&gt; 3 ...你看到的数量等于数量机器中的核心。

当你停止run方法时会发生什么,你发出一个立即运行的更新命令并等待一秒钟,直到你发出下一个命令,我认为你想要完成它。