Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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# 异步backgroundworker上的表单冻结_C#_Backgroundworker - Fatal编程技术网

C# 异步backgroundworker上的表单冻结

C# 异步backgroundworker上的表单冻结,c#,backgroundworker,C#,Backgroundworker,我一直在寻找这个问题的答案,但我想不出来。我不像其他一些语言那样熟悉C语言,任何信息都会有所帮助。无论我尝试什么,运行backgroundworker时表单都会冻结 backgroundWorker1.RunWorkerAsync(filepath); private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string filepath = e.Argument.ToStrin

我一直在寻找这个问题的答案,但我想不出来。我不像其他一些语言那样熟悉C语言,任何信息都会有所帮助。无论我尝试什么,运行backgroundworker时表单都会冻结

backgroundWorker1.RunWorkerAsync(filepath);

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        string filepath = e.Argument.ToString();

        using (Image image = Image.FromFile(filepath))
        {
            using (MemoryStream ms = new MemoryStream())
            {
                image.Save(ms, ImageFormat.Png);
                byte[] imageBytes = ms.ToArray();
                string base64String = Convert.ToBase64String(imageBytes);
                e.Result = base64String;
            }
        }  
        System.Threading.Thread.Sleep(1000);
    }

private void backgroundWorker1_RunWorkerCompleted(object sender,   RunWorkerCompletedEventArgs e)
    {
        textBox1.Text = e.Result.ToString();
    }

您的代码看起来正确。但是,您正在暂停背景线程1秒钟。要避免这种行为,您只需删除这行代码:

 System.Threading.Thread.Sleep(1000);

您的代码看起来正确。但是,您正在暂停背景线程1秒钟。要避免这种行为,您只需删除这行代码:

 System.Threading.Thread.Sleep(1000);

您应该考虑使用AsiNc/Access,因为微软重新使用它代替后台工作人员。

假设您的工作人员在按钮单击事件中被触发,它将如下所示:

 private async void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = await Task.Run(() =>
        {
            using (Image image = Image.FromFile(filepath))
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    image.Save(ms, ImageFormat.Png);
                    byte[] imageBytes = ms.ToArray();
                    string base64String = Convert.ToBase64String(imageBytes);
                    return base64String;
                }
            }
        });
    }

您应该考虑使用AsiNc/Access,因为微软重新使用它代替后台工作人员。

假设您的工作人员在按钮单击事件中被触发,它将如下所示:

 private async void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = await Task.Run(() =>
        {
            using (Image image = Image.FromFile(filepath))
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    image.Save(ms, ImageFormat.Png);
                    byte[] imageBytes = ms.ToArray();
                    string base64String = Convert.ToBase64String(imageBytes);
                    return base64String;
                }
            }
        });
    }


是否冻结一秒钟?移除系统。线程。线程。睡眠(1000);你说的表格冻结是什么意思?它是否停止响应用户输入?它停止重画了吗?或者你的意思是,在worker完成之前,它不会做任何有趣的事情吗?对
Sleep
的调用在后台worker中,我不明白为什么会锁定UI。我觉得还有一些代码您没有向我们展示。是什么导致您的BackgroundWorker被调用?我只有backgroundWorker1.RunWorkerAsync(文件路径);在一个按钮内点击。filepath是一个字符串(string filepath=toolStripLabel1.Text;),最初我没有Thread.Sleep。它冻结了用户界面的任何一种方式它冻结了一秒钟吗?删除System.Threading.Thread.Sleep(1000);你说的表格冻结是什么意思?它是否停止响应用户输入?它停止重画了吗?或者你的意思是,在worker完成之前,它不会做任何有趣的事情吗?对
Sleep
的调用在后台worker中,我不明白为什么会锁定UI。我觉得还有一些代码您没有向我们展示。是什么导致您的BackgroundWorker被调用?我只有backgroundWorker1.RunWorkerAsync(文件路径);在一个按钮内点击。filepath是一个字符串(string filepath=toolStripLabel1.Text;),最初我没有Thread.Sleep。它冻结了BackgroundWorker内部的UI。如果工作程序实际上是异步执行的,那么不应该影响UI。这在BackgroundWorker内部。如果工作程序实际上是异步执行的,那么这不应该影响UI。虽然很有帮助,但它并没有真正回答这个问题。OP需要回复您的评论。谢谢,但是使用异步/等待代码似乎与后台工作程序的工作方式相同。表单仍然冻结,直到操作完成。您正在使用的方法之一应该是冻结UI。代码中一定有你没有展示给我们的东西。虽然有帮助,但它并不能真正回答问题。OP需要回复您的评论。谢谢,但是使用异步/等待代码似乎与后台工作程序的工作方式相同。表单仍然冻结,直到操作完成。您正在使用的方法之一应该是冻结UI。代码中一定有你没有给我们看的东西。