线程和异步问题求助

s0611163 2020-10-21 11:14:30
同事写的代码,WCF服务端所有服务方法都用Task包了一下,我觉得是不必要的。说服不了他,所以来这里请教,如果代码有问题,公司里所有项目都是这样的,影响也挺大的。
WCF服务端代码:
public List<TpDevice> GetDeviceListAll()
{
if (HI.Get<ISecurityImp>().CheckTicket())
{
var result = FactoryStartNew.StartNewThread<List<TpDevice>>(() => { return HI.Get<IBaseDataImp>().GetDeviceListAll(); });
return result;
}
return new List<TpDevice>();
}

FactoryStartNew.cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SunCreate.Common.ComLib
{
/// <summary>
/// 2018-12-19 BY:Leon (勿修改其中代码)
/// </summary>
public class FactoryStartNew
{
private static log4net.ILog m_Log = log4net.LogManager.GetLogger(typeof(FactoryStartNew));

/// <summary>
/// 通过线程运行函数
/// </summary>
/// <param name="action">运行函数</param>
public static void StartNewThread(Action action)
{

System.Threading.Tasks.Task va = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
try
{
action();
}
catch (System.Exception ex)
{
m_Log.Error(ex);
}
})
.ContinueWith(o => { return; });
va.Wait();
}

/// <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);
}
}
}
}
...全文
2709 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2020-10-21
  • 打赏
  • 举报
回复
哦,看错了。没问题,他都result同步拿结果了 so,就跟楼上说的一样,画蛇添足了,其实他最终还是同步阻塞的和没写一样 还是那句话,水涨船高,水平不到,强行灌水。把船沉了 我们在其他帖子也说了,玩这个先弄清楚并行,并发,同步异步,然后在弄。这个都搞不清,别挖坑
wanghui0380 2020-10-21
  • 打赏
  • 举报
回复
话说这代码看上去有问题哦,并行是并行了 返回值成问题,tsak一启动,立刻就返回了,结果是null
s0611163 2020-10-21
  • 打赏
  • 举报
回复
引用 3 楼 wanghui0380 的回复:
这个把,水涨船高。 水平不到,俺们也不想说啥,说多了怕淹死你了,毕竟船已沉,在灌水就要淹了 ps:task归属于并行编程(和博客园的粉不同的地方,我不是不是啥玩意都喊并发,并发的),他提高的是并行能力,当然并行也不能无限度并行,资源有限当到系统上限才是博客园粉口里的并发 问题是你的系统需不需要提高并行能力,1小时100client访问一次自然不需要,1分钟10000 client访问一次就需要优化并行,1秒种10000 client访问就需要控并发。 so,我们不讨论你们谁对谁不对,只讨论系统需要不需要
客户端有好几百吧,同事用了Nginx解决,多部几个服务端,抗的住。 还有一个问题就是,原来WCF服务端是没有try catch,然后服务端崩过,用了这个,里面再加上try catch,尽然不崩了。 老中医可不知道药里的化学成分,他就是能治好病,这病你可能治不好。
datafansbj 2020-10-21
  • 打赏
  • 举报
回复
典型的将简单的事情复杂化。一个 Task 启动后,直接 Wait,画蛇添足。
wanghui0380 2020-10-21
  • 打赏
  • 举报
回复
这个把,水涨船高。 水平不到,俺们也不想说啥,说多了怕淹死你了,毕竟船已沉,在灌水就要淹了 ps:task归属于并行编程(和博客园的粉不同的地方,我不是不是啥玩意都喊并发,并发的),他提高的是并行能力,当然并行也不能无限度并行,资源有限当到系统上限才是博客园粉口里的并发 问题是你的系统需不需要提高并行能力,1小时100client访问一次自然不需要,1分钟10000 client访问一次就需要优化并行,1秒种10000 client访问就需要控并发。 so,我们不讨论你们谁对谁不对,只讨论系统需要不需要
正怒月神 2020-10-21
  • 打赏
  • 举报
回复
你用 jmeter 给他来个1000线程并发测试。 然后他就知道了
欧皇神降术 2020-10-21
  • 打赏
  • 举报
回复
你同事在东施效颦,是为了模仿接口async/await
正怒月神 2020-10-21
  • 打赏
  • 举报
回复
引用 5 楼 秋荷雨翔 的回复:
[quote=引用 3 楼 wanghui0380 的回复:]这个把,水涨船高。 水平不到,俺们也不想说啥,说多了怕淹死你了,毕竟船已沉,在灌水就要淹了 ps:task归属于并行编程(和博客园的粉不同的地方,我不是不是啥玩意都喊并发,并发的),他提高的是并行能力,当然并行也不能无限度并行,资源有限当到系统上限才是博客园粉口里的并发 问题是你的系统需不需要提高并行能力,1小时100client访问一次自然不需要,1分钟10000 client访问一次就需要优化并行,1秒种10000 client访问就需要控并发。 so,我们不讨论你们谁对谁不对,只讨论系统需要不需要
客户端有好几百吧,同事用了Nginx解决,多部几个服务端,抗的住。 还有一个问题就是,原来WCF服务端是没有try catch,然后服务端崩过,用了这个,里面再加上try catch,尽然不崩了。 老中医可不知道药里的化学成分,他就是能治好病,这病你可能治不好。[/quote] 你这个同事也真是人才。。。。 把简单的代码复杂化,还不如不并发。 建议让他好好看看 async await怎么使用。 内部还是wait,有什么用呢。还是一样要等待。 至于好几百的并发,就要通过nginx来解决,是不是nginx太掉价了。 正常,你哪怕是不用任何东西,不用task,几百的并发也是绰绰有余。 上面的代码,如果真想锈task,那还不如直接 Task().Result 但是这和不用task也就没区别了。 所以想学技术是好的,但是让你同事别一知半解锈技巧, 更加别再上线的项目里玩自己一知半解的技巧。
wanghui0380 2020-10-21
  • 打赏
  • 举报
回复
也不说中医不中医,至少从药方上可以看出东西 if (HI.Get<ISecurityImp>().CheckTicket()) { var result = FactoryStartNew.StartNewThread<List<TpDevice>>(() => { return HI.Get<IBaseDataImp>().GetDeviceListAll(); }); return result; } HI---------------------很明显,他想表达高大上,高并发,高并行 CheckTicket-------------------他想控并发,限流,解决幂等性,防刷 至于后面那个蓝色部分,上面已经说了,其实没起什么作用,因为他还是用同步代码阻塞了,虽然执行并行了,但是拿结果是阻塞的。效果上和没用一样
欧皇神降术 2020-10-21
  • 打赏
  • 举报
回复
引用 5 楼 秋荷雨翔 的回复:
[quote=引用 3 楼 wanghui0380 的回复:]这个把,水涨船高。

水平不到,俺们也不想说啥,说多了怕淹死你了,毕竟船已沉,在灌水就要淹了


ps:task归属于并行编程(和博客园的粉不同的地方,我不是不是啥玩意都喊并发,并发的),他提高的是并行能力,当然并行也不能无限度并行,资源有限当到系统上限才是博客园粉口里的并发

问题是你的系统需不需要提高并行能力,1小时100client访问一次自然不需要,1分钟10000 client访问一次就需要优化并行,1秒种10000 client访问就需要控并发。
so,我们不讨论你们谁对谁不对,只讨论系统需要不需要


客户端有好几百吧,同事用了Nginx解决,多部几个服务端,抗的住。
还有一个问题就是,原来WCF服务端是没有try catch,然后服务端崩过,用了这个,里面再加上try catch,尽然不崩了。
老中医可不知道药里的化学成分,他就是能治好病,这病你可能治不好。[/quote]
崩溃那是之前没做异常处理,这个做了(单纯的捕获异常就能防止崩溃了和Task无关)。乱用Task是不可取的。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧