C#中task run
时间: 2023-11-26 11:38:27 浏览: 135
在C#中,Task.Run和Task.Factory.StartNew都可以用于在后台线程上运行一个任务。两者之间的主要区别在于它们创建任务的方式以及返回值类型。
Task.Run是一个简化的方法,它接受一个Action或Func委托作为参数,并返回一个Task对象。它会自动将传入的委托包装到一个Task中并启动。
Task.Factory.StartNew是一个更灵活的方法,它可以接受一个Action或Func委托,还可以接受一些额外的参数,例如TaskCreationOptions和TaskScheduler。它返回一个Task对象,但是需要注意的是,如果传入的委托是异步的(即使用async关键字修饰),那么返回的Task将是一个嵌套的Task<Task>。
在你的代码中,由于使用了async关键字修饰传入的委托,所以Task.Factory.StartNew返回的是一个Task<Task>。因此,你需要使用两个await来等待内部的Task执行完成。
下面是修正后的代码示例:
```
internal class Program
{
static async Task Main(string[] args)
{
var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
var tmp = i;
tasks.Add(Task.Factory.StartNew(async () =>
{
await Task.Delay(1000);
Console.WriteLine(tmp);
}).Unwrap());
}
await Task.WhenAll(tasks);
Console.WriteLine("ok");
}
}
```
阅读全文