同事写了这样一段代码:

FactoryStartNew类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace SunCreate.Common.ComLib
{
/// <summary>
/// 2018-12-19 (勿修改其中代码)
/// </summary>
public class FactoryStartNew
{
private static log4net.ILog m_Log = log4net.LogManager.GetLogger(typeof(FactoryStartNew)); /// <summary>
/// 通过线程运行函数
/// </summary>
/// <typeparam name="TResult">返回值类型</typeparam>
/// <param name="action">运行函数</param>
/// <returns>返回值</returns>
public static TResult StartNewThread<TResult>(Func<TResult> action)
{
try
{
TResult bRst;
System.Threading.Tasks.Task<TResult> va = System.Threading.Tasks.Task.Factory.StartNew<TResult>(() =>
{
return action();
})
.ContinueWith<TResult>(o => { return o.Result; });
bRst = va.Result;
return bRst;
}
catch (System.Exception ex)
{
m_Log.Error(ex);
return default(TResult);
}
}
}
}

在WCF服务中使用:

public IList<VIPF_VIDEO_DEVICE> GetAllDevice()
{
if (HI.Get<ISecurityImp>().CheckTicket())
{
return FactoryStartNew.StartNewThread<IList<VIPF_VIDEO_DEVICE>>(() => { return HI.Get<IBaseDataImp>().GetAllDevice(); });
}
return new List<VIPF_VIDEO_DEVICE>();
}

我认为这个代码是错误的:当StartNewThread这个方法执行一个耗时的操作时,在执行操作的时间内,子线程在执行耗时操作,调用线程即父线程在阻塞(因为这句代码:bRst = va.Result;),这样在执行操作这段时间内,长时间占用了两个线程,多占用了一个线程。而且这个方法被写成了同步方法,而不是一个异步方法。WCF服务端所有方法都用StartNewThread方法包装一下,会导致多使用一倍的线程来处理同样多的请求。

跟同事说过多次,但同事至今认为他的方法没有问题他对Task的理解没有错,所以我打算把这个随笔发到博客园首页,看看评论中能否有简捷清晰的描述,让同事明白这个问题,或者,我的理解是错的。

我比较执着,虽然能够容忍项目中有不好的代码,但是无法容忍如此重要的代码存在错误。

一个Task.Factory.StartNew的错误用法的更多相关文章

  1. Task.Factory.StartNew的用法

    代码: private void button5_Click(object sender, EventArgs e) { ; Task.Factory.StartNew(() => { Mess ...

  2. c#4.0 Task.Factory.StartNew 用法

    var t1 = Task.Factory.StartNew<string>(() => { return “1111111”; }); //t1.Wait(); t1.Contin ...

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

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

  4. Task.Run Vs Task.Factory.StartNew

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

  5. Task.Run Vs Task.Factory.StartNew z

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

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

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

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

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

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

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

  9. task.factory.startnew()

    1.委托: public delegate int Math(int param1,int param2);定义委托类型 Public int Add(int param1,int param2)// ...

随机推荐

  1. brew清华镜像

    https://mirror.tuna.tsinghua.edu.cn/help/homebrew/

  2. TabLayout+ViewPager制作简单导航栏

    先看样例,有图有真相 绑定viewpager 此处主要说明tablayout的使用方法,viewpager绑定fragment的介绍在其他文章说明 mBinding.tabsLayout.setupW ...

  3. 剑指offer-链表&数组

    1.圆圈中最后剩下的数 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...

  4. Webpack + VueJS 学习、跳坑和总结

    这篇随笔会陆续地更新下去,用于汇集一些关于Webpack的初学跳坑总结还有VueJS的基础知识. Webpack部分 ① 快速建立一个Webpack-Vue项目开发环境(4.39.1-2019/08/ ...

  5. 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法

    072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...

  6. 02 C语言最简单快速上手的IDE

    不要让开发环境 成为学习路上的拦路虎,先培养学习兴趣和学习路上的成就感,这个对于激励自己持续学习很重要. 等真正从小白入门了,甚至成为大牛了,能解决诸多困难问题了,安装个开发环境还会再是个什么难事吗? ...

  7. Java安全之Commons Collections1分析(一)

    Java安全之Commons Collections1分析(一) 0x00 前言 在CC链中,其实具体执行过程还是比较复杂的.建议调试前先将一些前置知识的基础给看一遍. Java安全之Commons ...

  8. 【dos】wmic命令

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 磁盘 查看硬盘信息:wmic diskdrive 查看逻辑盘信息:wmic l ...

  9. win10简单方法安装杜比v4音效!win10 1909适用!

    先下载这个! 链接: https://pan.baidu.com/s/1zAOOf-1aCJsjBgy36SiGWA 密码: s9n7 这个是杜比V4文件,257MB大小,适用32位64位系统!下 载 ...

  10. 数据结构与算法:AVL树

    AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.AV ...