Task.Run 和 Task.Factory.StartNew 区别

Task.Run 是在 dotnet framework 4.5 之后才可以使用, Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制。

可以认为 Task.Run 是简化的 Task.Factory.StartNew 的使用,除了需要指定一个线程是长时间占用的,否则就使用 Task.Run

创建新线程

下面来告诉大家使用两个函数创建新的线程

Task.Run(() =>
{
   var foo = 2;
});

这时 foo 的创建就在另一个线程,需要知道 Task.Run 用的是线程池,也就是不是调用这个函数就会一定创建一个新的线程,但是会在另一个线程运行。

Task.Factory.StartNew(() =>
{
    ar foo = 2;
});

可以看到,两个方法实际上是没有差别,但是Task.Run比较好看,所以推荐使用Task.Run

等待线程

创建的线程,如果需要等待线程执行完成在继续,那么可以使用 await 等待

private static async void SeenereKousa()
{
     Console.WriteLine("开始 线程"+Thread.CurrentThread.ManagedThreadId);
     await Task.Run(() =>
     {
         Console.WriteLine("进入 线程" + Thread.CurrentThread.ManagedThreadId);
     });
     Console.WriteLine("退出 线程"+Thread.CurrentThread.ManagedThreadId);
}

但是需要说的是这里使用 await 主要是给函数调用的外面使用,上面代码在函数里面使用 await 函数是 void 那么和把代码放在 task 里面是相同

private static async void SeenereKousa()
{
    Console.WriteLine("开始 线程"+Thread.CurrentThread.ManagedThreadId);
    await Task.Run(() =>
    {
         Console.WriteLine("进入 线程" + Thread.CurrentThread.ManagedThreadId);
         Console.WriteLine("退出 线程"+Thread.CurrentThread.ManagedThreadId);
    });
}

但是如果把 void 修改为 Task ,那么等待线程才有用

除了使用 await 等待,还可以使用 WaitAll 等待

 Console.WriteLine("开始 线程" + Thread.CurrentThread.ManagedThreadId);
 var t = Task.Run(() =>
 {
      Console.WriteLine("进入 线程" + Thread.CurrentThread.ManagedThreadId);
 });

 Task.WaitAll(t);
 Console.WriteLine("退出 线程" + Thread.CurrentThread.ManagedThreadId);

使用 WaitAll 是在调用 WaitAll 的线程等待,也就是先在线程 1 运行,然后异步到 线程2 运行,这时线程1 等待线程2运行完成再继续,所以输出

  1. 开始 线程1

  2.  

    进入 线程2

  3.  

    退出 线程1

长时间运行

两个函数最大的不同在于 Task.Factory.StartNew 可以设置线程是长时间运行,这时线程池就不会等待这个线程回收

Task.Factory.StartNew(() =>
{
      for (int i = 0; i < 100; i++)
      {
           var foo = 2;
      }
      Console.WriteLine("进行 线程" + Thread.CurrentThread.ManagedThreadId);
}, TaskCreationOptions.LongRunning);

所以在需要设置线程是长时间运行的才需要使用 Task.Factory.StartNew 不然就使用 Task.Run

调用 Task.Run(foo) 就和使用下面代码一样

Task.Factory.StartNew(foo, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

原文地址:https://www.cnblogs.com/wangyu19900123/p/11811312.html

时间: 2024-07-30 19:49:39

Task.Run 和 Task.Factory.StartNew 区别的相关文章

Task.Run 和Task.Factory.StartNew 区别

.Net Framework 4.0开始支持Task.Factory.StartNew,.Net Framework 4.5后开始支持Task.Run. Task.Factory.StartNew经过简化成了Task.Run,注意的是Factory.StartNew的方法参数种类更丰富,可以完成多样的需求. 在选择上,如果创建的线程需要长时间运行的话那就选择Task.Factory.StartNew. 一:使用 Task.Run(() =>{......}); Task.Factory.Star

Task.Run vs Task.Factory.StartNew

Task.Run 和 Task.Factory.StartNew 都可以把一段要执行的代码放到ThreadPool thread中去执行.Task.Factory.StartNew是.Net 4.0中引入的,而Task.Run则是在.Net 4.5中引入,首要目的是为了简化Task.Factory.StartNew的使用.简言之, Task.Run(someAction) 与 Task.Factory.StartNew(someAction, CancellationToken.None, Ta

Task.Run 和 Task.Factory.StartNew

在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至控制任务的调度行为.所有这些能力也带来了复杂性的提升,你必须知道何时应该使用何种重载方法,提供哪种调度方式等等.并且Task.Factory.StartNew这种写法也不够简洁明快,至少对它使用的主要场景不够快,一般它使用的主要场景只是将一个工作任务丢给一个后台线程执行而已. 于是,在.NET Fr

.Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法

前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下,有一个泛型类,叫TaskCompletionSource<TReuslt>,它能控制Task的行为,如给Task设置结果.设置异常.设置取消等. MSDN是这样描述的(网址): 表示未绑定到委托的 Task<TResult> 的制造者方,并通过Task属性提供对使用者方的访问. 它有以

Task.Factory.StartNew 和 Task.Run

项目中可能经常用到异步和线程,为了不影响主线程而新开一个线程去操作其他逻辑,那么Task 经常被人用到. 本人在一个工程中搜索后发现,主要有如下俩中用法: Task.Factory.StartNew(() => { }); Task.Run(() => { }); 应用场景都是一样的,为啥有俩中写法, 那么他的联系和区别有什么呢? 1)网上说: Task.Factory.StartNew和Task.Run区别之一就有Task.Run会自动执行Unwrap操作,但是Task.Factory.St

C# Task,new Task().Start(),Task.Run();TTask.Factory.StartNew

1. Task task = new Task(() => { MultiplyMethod(a, b); }); task.Start(); 2. Task task = Task.Run(() => { MultiplyMethod(a, b); }); 3. Task task = Task.Factory.StartNew(() => { MultiplyMethod(a, b); });

Task.Factory.StartNew 测试

到底该用多少线程?线程数.CPU核心数.本地计算时间.等待时间的关系 线程数 = CPU核心数 * ( 本地计算时间 + 等待时间 ) / 本地计算时间 下面是Task.Factory.StartNew和自己写的TaskHelper.LargeTask.Run对比测试 一.Task.Factory.StartNew 使用 TaskCreationOptions.LongRunning 参数 代码: private int n = 50000; //问题规模 private int t = 25;

MVC4 Task.Factory.StartNew 异步调用

MVC4也添加了一些异步的东西,不过一枝都没有研究过. 工作上遇到了发出一个调用,但是不去管调用结果如何的情况,在谢平师傅的指导下, 写成如下异步方式 Task.Factory.StartNew(() => { if (entity.IsManager == true) { bool resultSetOnlineReportOn = ReportOnlineProxy.SaveUIDPermissions(entity.Uid, true); } else { bool resultSetOn

Task.Factory.StartNew的用法

代码: private void button5_Click(object sender, EventArgs e) { int val = 5; Task.Factory.StartNew(() => { MessageBox.Show("测试StartNew:无参数"); }); Task.Factory.StartNew(a => { MessageBox.Show("测试StartNew:参数值" + (int)a); }, val); }