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。
答案 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。