C# 异步backgroundworker上的表单冻结
我一直在寻找这个问题的答案,但我想不出来。我不像其他一些语言那样熟悉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
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。代码中一定有你没有给我们看的东西。