c#WPF进度条更新

c#WPF进度条更新,c#,wpf,C#,Wpf,所以我有一个进度条,每次睡觉后我都会改变它的值。有没有什么方法可以让进度条直观地实时更新,而不只是坐在0%的位置,在执行结束后跳到100%的位置 private Client getConnectionPDU() { // Client à retourné PrimS.Telnet.Client client = null; // Ouverture de la connection try {

所以我有一个进度条,每次睡觉后我都会改变它的值。有没有什么方法可以让进度条直观地实时更新,而不只是坐在0%的位置,在执行结束后跳到100%的位置

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