Task.Run与Task.Factory.StartNew的区别
时间: 2024-03-05 12:28:49 浏览: 176
Task.Run 和 Task.Factory.StartNew 都可以用来创建并启动一个新的任务,但是它们有以下区别:
1. 调用方式不同:Task.Run 是一个静态方法,可以直接通过类调用;而 Task.Factory.StartNew 是通过 Task.Factory 实例化一个 Task 对象,再调用其 StartNew 方法。
2. Task.Run 更加简洁:Task.Run 只需要传入一个 Action 或 Func 委托作为任务的执行体,而 Task.Factory.StartNew 则需要传入一个 TaskCreationOptions 枚举值来指定任务的类型。
3. Task.Run 默认使用 TaskScheduler.Default 调度器:Task.Run 创建的任务默认使用 TaskScheduler.Default 调度器,在 .NET Framework 4.5 之后,这个调度器会使用当前线程的上下文来执行任务。而 Task.Factory.StartNew 则需要通过重载方法来指定调度器。
综上所述,Task.Run 更加简洁易用,且默认使用当前线程上下文执行任务,而 Task.Factory.StartNew 则可以更加灵活地指定任务的类型和调度器。
相关问题
winform task.run与Task.Factory.StartNew有什么区别
`Task.Run` 和 `Task.Factory.StartNew` 都可以用来在新线程中执行一个任务,但是它们之间有些微小的区别。
`Task.Run` 是 `Task.Factory.StartNew` 的一个简化版,使用起来更加方便。它的语法如下:
```csharp
Task.Run(() => {
// 执行任务的代码
});
```
`Task.Run` 会自动创建一个 `Task` 对象并且将任务放到线程池中执行。它还有一些重载方法,可以方便地传递参数和配置任务的行为。
`Task.Factory.StartNew` 则更加灵活,它的语法如下:
```csharp
Task.Factory.StartNew(() => {
// 执行任务的代码
}, TaskCreationOptions.LongRunning);
```
`Task.Factory.StartNew` 可以通过传递不同的参数来配置任务的行为,例如:
- `TaskCreationOptions.LongRunning`:提示任务需要一个长时间运行的线程,这个选项会让线程池为任务创建一个新线程,而不是使用线程池中的线程。
- `TaskCreationOptions.AttachedToParent`:将任务和它的父任务关联起来,当父任务完成时,子任务也会被取消。
总之,`Task.Run` 更加简便,而 `Task.Factory.StartNew` 则更加灵活。在一般情况下,建议使用 `Task.Run`。
winform Task.Factory.StartNew与Task.run的区别
`Task.Factory.StartNew` 和 `Task.Run` 都是用于创建并执行异步任务的方法,它们的主要区别在于:
1. `Task.Factory.StartNew` 的第一个参数是一个委托,而 `Task.Run` 的参数是一个 `Func<Task>` 委托。也就是说,`Task.Run` 直接接受一个返回 `Task` 的方法作为参数,而 `Task.Factory.StartNew` 则需要传入一个委托(`Action` 或 `Func<T>`),并且需要手动指定 `TaskCreationOptions` 和 `TaskScheduler`。
2. `Task.Run` 会自动将 `TaskCreationOptions` 设置为 `TaskCreationOptions.DenyChildAttach`,这样创建的任务将不会作为父任务的子任务执行。而 `Task.Factory.StartNew` 默认会创建可附加的子任务。
3. `Task.Run` 和 `Task.Factory.StartNew` 默认使用 `TaskScheduler.Default`,也就是线程池调度器。但是,`Task.Factory.StartNew` 可以明确地指定任务使用的调度器。
因此,如果你只需要创建一个简单的异步任务,并且不需要手动指定 `TaskCreationOptions` 和 `TaskScheduler`,那么 `Task.Run` 是更简洁、更易读的选择。而如果你需要更多的灵活性和控制,可以使用 `Task.Factory.StartNew`。
阅读全文