同事写了这样一段代码:

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. Spring Boot第四弹,一文教你如何无感知切换日志框架?

    持续原创输出,点击上方蓝字关注我吧 目录 前言 Spring Boot 版本 什么是日志门面? 如何做到无感知切换? 如何切换? 引入依赖 指定配置文件 日志如何配置? 总结 前言 首先要感谢一下读者 ...

  2. Python练习题 017:三支乒乓球队出赛名单

    [Python练习题 017] 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比.请编程序找 ...

  3. spring-boot-route(三)实现多文件上传

    Spring Boot默认上传的单个文件大小1MB,一次上传的总文件大小为10MB. 单个文件上传使用MultipartFile参数来接收文件,多文件使用MultipartFile[]数组来接收,然后 ...

  4. Centos6.6x系统与unbutu18.04系统升级ssh到8.3版本

    Centos6.6升级ssh5.3版本到ssh8.3版本 下载所需要的源码包: ]#wget https://files-cdn.cnblogs.com/files/luckjinyan/zlib-1 ...

  5. 无所不能的Embedding 2. FastText词向量&文本分类

    Fasttext是FaceBook开源的文本分类和词向量训练库.最初看其他教程看的我十分迷惑,咋的一会ngram是字符一会ngram又变成了单词,最后发现其实是两个模型,一个是文本分类模型[Ref2] ...

  6. Java知识系统回顾整理01基础06数组03排序

    一.选择法排序 选择法排序的思路: 把第一位和其他所有的进行比较,只要比第一位小的,就换到第一个位置来 比较完后,第一位就是最小的 然后再从第二位和剩余的其他所有进行比较,只要比第二位小,就换到第二个 ...

  7. Python实现的数据结构与算法之双端队列详解

    一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两 ...

  8. matlab receive License Manager Error -103?

    参考:https://www.mathworks.com/matlabcentral/answers/91874-why-do-i-receive-license-manager-error-103 ...

  9. MATLAB鼠标事件

    来源:https://blog.csdn.net/weixin_39090239/article/details/80586930 前记: 人机交互的方式--键盘开关.鼠标.触摸屏.体感传感器(Kin ...

  10. IDEA2020.2的破解

    第一种方式:http://code.39sd.cn/ 直接获取二维码: 第二种:下载破解工具(本方法只是提供个人学习使用) 1.下载2020.2的idea 链接:https://pan.baidu.c ...