Task.Run 是在 dotnet framework 4.5 之后才可以使用,但是 Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制。可以认为 Task.Run 是简化的 Task.Factory.StartNew 的使用,除了需要指定一个线程是长时间占用的,否则就使用 Task.Run。

长时间运行

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

Task.Factory.StartNew(() =>
{
Console.WriteLine("进行 线程" + Thread.CurrentThread.ManagedThreadId);
}, TaskCreationOptions.LongRunning);

线程异常的操作

Task.Run和Task.Factory.StartNew里面有异常的时候都是不会抛出来的,所以需要捕获异常。
外面捕获异常没有反应,这种写法不对

for (int i = ; i < ; i++)
{
try
{
Task.Factory.StartNew(() =>
{ Console.WriteLine($"Task.Factory.StartNew value {i}");
int value = / (i % );
});
}
catch
{
Console.WriteLine("Task.Factory.StartNew异常");
} Thread.Sleep();
} for (int j = ; j < ; j++)
{ try
{
Task.Run(() =>
{
Console.WriteLine($"Task.Run value {j}");
int value = / (j % );
});
}
catch
{
Console.WriteLine("Task.Run异常");
} Thread.Sleep();
}

在线程内捕获异常,这是正确的写法

for (int i = ; i < ; i++)
{
Task.Factory.StartNew(() =>
{
try
{
Console.WriteLine($"Task.Factory.StartNew value {i}");
int value = / (i % );
}
catch
{
Console.WriteLine("Task.Factory.StartNew异常");
}
});
Thread.Sleep();
} for (int j = ; j < ; j++)
{
Task.Run(() =>
{
try
{
Console.WriteLine($"Task.Run value {j}");
int value = / (j % );
}
catch
{
Console.WriteLine("Task.Run异常");
}
});
Thread.Sleep();
}

其他的线程文章

1. C#中await/async闲说

2. .NET中并行开发优化

3. C# Task.Run 和 Task.Factory.StartNew 区别

4. C#中多线程的并行处理

5. C#中多线程中变量研究

C# Task.Run 和 Task.Factory.StartNew 区别的更多相关文章

  1. Task.Run与Task.Factory.StartNew的区别

    Task是可能有延迟的工作单元,目的是生成一个结果值,或产生想要的效果.任务和线程的区别是:任务代表需要执行的作业,而线程代表做这个作业的工作者. 在.Net 4中,Task.Factory.Star ...

  2. 【.NET】- Task.Run 和 Task.Factory.StartNew 区别

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

  3. Task.Run 和 Task.Factory.StartNew 区别

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

  4. .NET - Task.Run vs Task.Factory.StartNew

    翻译自 Stephen Toub 2011年10月24日的博文<Task.Run vs Task.Factory.StartNew>,Stephen Toub 是微软并行计算平台团队的首席 ...

  5. Task.Run Vs Task.Factory.StartNew

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  6. Task.Run Vs Task.Factory.StartNew z

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  7. Task.Run Vs Task.Factory.StartNew 【收藏】

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  8. Task.Run 和 Task.Factory.StartNew

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

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

    前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下, ...

随机推荐

  1. Linux下安装docker(1)

    1.由于centos系统已经自带docker源了,所以可以直接安装: yum install docker 如果是centos6.5版本的,使用yum -y install docker-io 进行安 ...

  2. 如何解决fiddler的响应显示乱码问题

    fiddler中Response出现乱码, 这是因为HTML被压缩了, 我们可以通过两种方法去解压.方法1:点击Response Raw上方的"Response is encoded any ...

  3. py库:threading

    https://www.youtube.com/watch?v=DnTn3Yx-Nvg  join功能: import threading import time def thread_job2(): ...

  4. mybatis 映射生成mapper和pojo ---逆向工程的使用过程

    使用逆向工程生成mapper和pojo 2. 新建一个项目,随便叫什么 3.导入mybatis-generator-core .mybatis.mybatis-spring.log4j等jar 4.在 ...

  5. 稀疏矩阵 part 1

    ▶ 图片参考[http://www.bu.edu/pasi/files/2011/01/NathanBell1-10-1000.pdf] ▶ 各种系数矩阵的数据结构 ● MAT,原始矩阵数据 type ...

  6. go 0000

    1,函数不能比较 函数默认都是值传递,  除了  map   值, slice (切片)  channel  (管道)   interface 默认以这4个默认 引用传递 两个 defer      ...

  7. reg 和wire 区别

    reg相当于存储单元,wire相当于物理连线 Verilog 中变量的物理数据分为线型和寄存器型.这两种类型的变量在定义时要设置位宽,缺省为1位.变量的每一位可以是0,1,X,Z.其中x代表一个未被预 ...

  8. Autofac使用代码方式进行组件注册【不需要依赖】

    public class AutofacFactory2     {         IBank bank;         public AutofacFactory2()         {    ...

  9. Word2vec教程

    Word2vec Tutorial RADIM ŘEHŮŘEK 2014-02-02GENSIM, PROGRAMMING157 COMMENTS I never got round to writi ...

  10. Python创建随机用户名密码并存放于Access数据库

    利用random库随机生成4到32位包含字母跟数字的用户名密码,利用win32com库连接到access数据库并写入table,要更改创建的用户名密码数量修改18行代码的数字即可. import wi ...