c#WPF进度条更新
所以我有一个进度条,每次睡觉后我都会改变它的值。有没有什么方法可以让进度条直观地实时更新,而不只是坐在0%的位置,在执行结束后跳到100%的位置c#WPF进度条更新,c#,wpf,C#,Wpf,所以我有一个进度条,每次睡觉后我都会改变它的值。有没有什么方法可以让进度条直观地实时更新,而不只是坐在0%的位置,在执行结束后跳到100%的位置 private Client getConnectionPDU() { // Client à retourné PrimS.Telnet.Client client = null; // Ouverture de la connection try {
private Client getConnectionPDU()
{
// Client à retourné
PrimS.Telnet.Client client = null;
// Ouverture de la connection
try
{
// --- Ouverture de la connexion
client = new Client(rackToIP[selectedRack], addrPort, new System.Threading.CancellationToken());
console.Text += client.Read();
Thread.Sleep(sleep);
progressBar.Value = 20;
// --- Username
client.WriteLine(username + enter);
Thread.Sleep(sleep);
progressBar.Value = 40;
console.Text += "\n" + client.Read();
Thread.Sleep(sleep);
progressBar.Value = 60;
// --- Password
client.WriteLine(password + enter);
Thread.Sleep(sleep);
progressBar.Value = 80;
console.Text += "\n" + client.Read();
Thread.Sleep(sleep);
progressBar.Value = 100;
}
catch (Exception e)
{
console.Text += "\n" + e.Message;
client = null;
}
// Scroll to end
scroller.ScrollToEnd();
return client;
}
您的代码阻塞了UI线程,在函数返回之前,从未给它机会以新的大小重新绘制进度条。您应该考虑使用<代码>异步代码> />代码>等待< /代码>以避免阻塞。 要使其正常工作,您需要进行一些更改:
- 将所有
调用更改为线程.Sleep
等待任务.Delay
- 更改
以返回getConnectionPDU
任务
- 将
标记为getConnectionPDU
async
private async void按钮1\u单击(对象发送方,事件参数e)
{
var TheClient=await getConnectionPDU();
}
专用异步任务getConnectionPDU()
{
//委托人
PrimS.Telnet.Client Client=null;
//连接线
尝试
{
//---康涅西翁酒店
client=new client(rackToIP[selectedRack],addrPort,new System.Threading.CancellationToken());
console.Text+=client.Read();
等待任务。延迟(睡眠);
progressBar.值=20;
//---用户名
client.WriteLine(用户名+输入);
等待任务。延迟(睡眠);
progressBar.值=40;
console.Text+=“\n”+client.Read();
等待任务。延迟(睡眠);
progressBar.Value=60;
//---密码
client.WriteLine(密码+输入);
等待任务。延迟(睡眠);
progressBar.值=80;
console.Text+=“\n”+client.Read();
等待任务。延迟(睡眠);
progressBar.值=100;
}
捕获(例外e)
{
console.Text+=“\n”+e.消息;
client=null;
}
//滚动到末尾
scroller.ScrollToEnd();
返回客户;
}
我建议使用backgroundWorker线程。下面是一个类似的问题,你想做什么:
您的代码阻塞了UI线程,没有给它机会以新的大小实际绘制进度条。考虑使用<代码>异步> /代码> />代码>等待<代码>以避免该问题。将
线程.睡眠
替换为等待任务.延迟
。您还必须使getConnectionPDU
返回一个任务
,并将其标记为async
。这可能会深入到多个层次,具体取决于调用此函数的内容。可能的重复我想说,这不是该问题的重复,因为他不是专门询问背景工作人员,可以通过多种不同的方式解决。
private async void Button1_click(object sender, EventArgs e)
{
var TheClient = await getConnectionPDU();
}
private async Task<Client> getConnectionPDU()
{
// Client à retourné
PrimS.Telnet.Client client = null;
// Ouverture de la connection
try
{
// --- Ouverture de la connexion
client = new Client(rackToIP[selectedRack], addrPort, new System.Threading.CancellationToken());
console.Text += client.Read();
await Task.Delay(sleep);
progressBar.Value = 20;
// --- Username
client.WriteLine(username + enter);
await Task.Delay(sleep);
progressBar.Value = 40;
console.Text += "\n" + client.Read();
await Task.Delay(sleep);
progressBar.Value = 60;
// --- Password
client.WriteLine(password + enter);
await Task.Delay(sleep);
progressBar.Value = 80;
console.Text += "\n" + client.Read();
await Task.Delay(sleep);
progressBar.Value = 100;
}
catch (Exception e)
{
console.Text += "\n" + e.Message;
client = null;
}
// Scroll to end
scroller.ScrollToEnd();
return client;
}