111,097
社区成员




private async void button1_Click(object sender, EventArgs e)
{
await Do(); //
Console.WriteLine("全部完成了");
}
public async Task Do()
{
Console.WriteLine($"当前主线程的ID是{Thread.CurrentThread.ManagedThreadId}");
List<Task> TaskList = new List<Task>();
var scheduler = new LimitedConcurrencyLevelTaskScheduler(70);
for (int i = 0; i < 50; i++)
{
Console.WriteLine($"当前{i}的ID是{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(100);
TaskList.Add(Task.Factory.StartNew(t =>
{
//这里插一个大量耗时过程
textBox1Set(Convert.ToInt32(t));
}, i, CancellationToken.None, TaskCreationOptions.None, scheduler));
}
await Task.WhenAll(TaskList.ToArray());
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}");
});
}
public async Task Do()
{
Console.WriteLine($"当前主线程的ID是{Thread.CurrentThread.ManagedThreadId}");
List<Task> TaskList = new List<Task>();
var scheduler = new LimitedConcurrencyLevelTaskScheduler(70);
for (int i = 0; i < 50; i++)
{
Console.WriteLine($"当前{i}的ID是{Thread.CurrentThread.ManagedThreadId}");
TaskList.Add(Task.Factory.StartNew(t =>
{
Thread.Sleep(100);
textBox1Set(Convert.ToInt32(t));
}, i, CancellationToken.None, TaskCreationOptions.None, scheduler));
}
await Task.WhenAll(TaskList.ToArray());
Console.WriteLine($"结束了");
}
作为延申,我实在没明白,为什么要把“task.factory.startnew ”改为“task.run”,虽然你解释了(防止你那个waitall不带入问题),但还是没懂。
还有,为什么把“ Thread.Sleep(1000);”改为“asycn await Task.Delay(2000) ”
我上面用法不是也挺好吗?
再次感谢!