窗体上放了一个按钮,一个文本框,经测试,下面的代码是不行的;
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine($"当前主线程的ID是{Thread.CurrentThread.ManagedThreadId}");
for (int i = 0; i < 100; i++)
{
Console.WriteLine($"当前{i}的ID是{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(100);
Task.Run(() =>
{
textBox1Set(i);
});
}
Console.WriteLine($"结束了");
}
public void textBox1Set(int I)//供当前及后续类写日志用
{
Console.WriteLine($"当前{I}的textBox1SetID是{Thread.CurrentThread.ManagedThreadId}");
textBox1.Invoke((EventHandler)delegate
{
textBox1.Text = I.ToString();
Console.WriteLine($"当前{I}的textBox1SetID的BeginInvoke是{Thread.CurrentThread.ManagedThreadId}");
});
}
必须用异步方法,加上async 和 await才行,如下:
private async void button1_Click(object sender, EventArgs e)
{
Console.WriteLine($"当前主线程的ID是{Thread.CurrentThread.ManagedThreadId}");
for (int i = 0; i < 100; i++)
{
Console.WriteLine($"当前{i}的ID是{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(100);
await Task.Run(() =>
{
textBox1Set(i);
});
}
Console.WriteLine($"结束了");
}
public void textBox1Set(int I)//供当前及后续类写日志用
{
Console.WriteLine($"当前{I}的textBox1SetID是{Thread.CurrentThread.ManagedThreadId}");
textBox1.Invoke((EventHandler)delegate
{
textBox1.Text = I.ToString();
Console.WriteLine($"当前{I}的textBox1SetID的BeginInvoke是{Thread.CurrentThread.ManagedThreadId}");
});
}
而我的问题是,用了异步,不就相当于另外开了一个线程吗,那和窗体所在的主线程应该不一样呀,如下图

请高手解惑,谢谢。