Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程更新GUI在随机时刻冻结_C#_Multithreading_Winforms - Fatal编程技术网

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

C# 线程更新GUI在随机时刻冻结,c#,multithreading,winforms,C#,Multithreading,Winforms,我有带按钮和文本框的表单。按钮是正在更新文本框值的起始线程 public Form1() { InitializeComponent(); myDelegate = new UpdateUi(updateUi); } private void button1_Click(object sender, EventArgs e) { myThread = new Thread(new ThreadStart(Th

我有带按钮和文本框的表单。按钮是正在更新文本框值的起始线程

    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);
            }

        }


    }
}
公共类MyThreadClass
{
Form1 myFormControl1;
公共MyThreadClass(Form1 myForm)
{
myFormControl1=myForm;
}
公开募捐
{
//在拥有代理的线程上执行指定的委托
//“myFormControl1”控件的基础窗口句柄。
对于(inti=0;i2->3->freeze->16->17等等)


我只做了一些修改就从中获取了代码,问题是您延迟了UI线程,而不是进程本身,所以发生的是您发出了所有更新命令,但由于它都在同一个线程上运行,因此会被阻塞,因为
线程.Sleep
停止UI线程,因此它会运行一堆
textBox1.Text=I.ToString()
然后它会在所有
线程的所有时间停止。Sleep(1000);
您看到的1->2->3…的数量可能等于您机器中的内核数量


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

示例中的
线程。Sleep
只会减慢它的速度。你不想这样,所以只需从代码中删除它。你这么说告诉我
Thread.Sleep
是造成这种奇怪行为的原因吗?他需要它才能看到
textBox1
@szpic中的数字:“将当前线程挂起指定的毫秒数。”如果UI线程处于睡眠状态,它将被冻结。睡眠应该在
MyThreadClass.Run()的循环中
,而不是在
updateUi()的UI上运行的代码中。