循环时显示当前变量值

时间:2014-02-06 12:32:45

标签: c# multithreading winforms

private void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;
    string IDs = ID.Text;
    string[] eachIDs = Regex.Split(IDs, "\n");
    foreach (var eachID in eachIDs)
    {
        getContent(eachID);
        titleBox.Text = "Done";
    }
}
private void getContent(string value)
{
    label1.Text = value;
    Thread.Sleep(5000);
}

我将在富文本框的新行中输入4个ID作为输入说“IDNUMBER01,IDNUMBER02,IDNUMBER03,IDNUMBER04”。

代码成功分割它们。我想在标签文本中显示当前循环中使用的ID的值。

我的代码问题是它只显示经过循环的最后一个ID。

3 个答案:

答案 0 :(得分:2)

可能是你的UI冻结而你看不到变化。试试这个,使用async/await功能:

private async void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;
    string IDs = ID.Text;
    string[] eachIDs = Regex.Split(IDs, "\n");
    foreach (var eachID in eachIDs)
    {
        await getContent(eachID);
        titleBox.Text = "Done";
    }
}
private async Task getContent(string value)
{
    label1.Text = value;
    await Task.Delay(5000);
}

答案 1 :(得分:1)

这是因为UI仅在执行此代码后更新,因为它们在同一个线程中执行。您将需要打开一个线程,运行此代码,并调用调度程序(如果此应用程序是Winforms,则调用Control.BeginInvoke)以更新UI。

修改

试试这个:

private void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;
    string IDs = ID.Text;
    new System.Threading.Thread(() =>
    {
        string[] eachIDs = Regex.Split(IDs, "\n");
        foreach (var eachID in eachIDs)
        {
            getContent(eachID);               
            titleBox.BeginInvoke((Action) delegate { titleBox.Text = "Done"; });  
        }
    }).Start();
}

private void getContent(string value)
{
    label1.BeginInvoke((Action) delegate { label1.Text = value; });        
    Thread.Sleep(5000);
}

答案 2 :(得分:0)

在您的示例中,您最好使用计时器来显示您的值文本。你只看到最后一个ID,因为循环执行得非常快,并且在foreach中使用Thread.Sleep不会飞。 您可以在Application.DoEvents()之前使用Thread.Sleep,但计时器仍然是您更好的选择... imho。