同事寫的代碼,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);
}
}
}
}
uj5u.com熱心網友回復:
你同事在東施效顰,是為了模仿介面async/await
uj5u.com熱心網友回復:
你用 jmeter 給他來個1000執行緒并發測驗。然后他就知道了
uj5u.com熱心網友回復:
這個把,水漲船高。水平不到,俺們也不想說啥,說多了怕淹死你了,畢竟船已沉,在灌水就要淹了
ps:task歸屬于并行編程(和博客園的粉不同的地方,我不是不是啥玩意都喊并發,并發的),他提高的是并行能力,當然并行也不能無限度并行,資源有限當到系統上限才是博客園粉口里的并發
問題是你的系統需不需要提高并行能力,1小時100client訪問一次自然不需要,1分鐘10000 client訪問一次就需要優化并行,1秒種10000 client訪問就需要控并發。
so,我們不討論你們誰對誰不對,只討論系統需要不需要
uj5u.com熱心網友回復:
典型的將簡單的事情復雜化。一個 Task 啟動后,直接 Wait,畫蛇添足。uj5u.com熱心網友回復:
客戶端有好幾百吧,同事用了Nginx解決,多部幾個服務端,抗的住。
還有一個問題就是,原來WCF服務端是沒有try catch,然后服務端崩過,用了這個,里面再加上try catch,盡然不崩了。
老中醫可不知道藥里的化學成分,他就是能治好病,這病你可能治不好。
uj5u.com熱心網友回復:
話說這代碼看上去有問題哦,并行是并行了回傳值成問題,tsak一啟動,立刻就回傳了,結果是null
uj5u.com熱心網友回復:
哦,看錯了。沒問題,他都result同步拿結果了so,就跟樓上說的一樣,畫蛇添足了,其實他最侄訓是同步阻塞的和沒寫一樣
還是那句話,水漲船高,水平不到,強行灌水。把船沉了
我們在其他帖子也說了,玩這個先弄清楚并行,并發,同步異步,然后在弄。這個都搞不清,別挖坑
uj5u.com熱心網友回復:
崩潰那是之前沒做例外處理,這個做了(單純的捕獲例外就能防止崩潰了和Task無關)。亂用Task是不可取的。
uj5u.com熱心網友回復:
也不說中醫不中醫,至少從藥方上可以看出東西if (HI.Get<ISecurityImp>().CheckTicket())
{
var result = FactoryStartNew.StartNewThread<List<TpDevice>>(() => { return HI.Get<IBaseDataImp>().GetDeviceListAll(); });
return result;
}
HI---------------------很明顯,他想表達高大上,高并發,高并行
CheckTicket-------------------他想控并發,限流,解決冪等性,防刷
至于后面那個藍色部分,上面已經說了,其實沒起什么作用,因為他還是用同步代碼阻塞了,雖然執行并行了,但是拿結果是阻塞的。效果上和沒用一樣
uj5u.com熱心網友回復:
這個把,水漲船高。
水平不到,俺們也不想說啥,說多了怕淹死你了,畢竟船已沉,在灌水就要淹了
ps:task歸屬于并行編程(和博客園的粉不同的地方,我不是不是啥玩意都喊并發,并發的),他提高的是并行能力,當然并行也不能無限度并行,資源有限當到系統上限才是博客園粉口里的并發
問題是你的系統需不需要提高并行能力,1小時100client訪問一次自然不需要,1分鐘10000 client訪問一次就需要優化并行,1秒種10000 client訪問就需要控并發。
so,我們不討論你們誰對誰不對,只討論系統需要不需要
客戶端有好幾百吧,同事用了Nginx解決,多部幾個服務端,抗的住。
還有一個問題就是,原來WCF服務端是沒有try catch,然后服務端崩過,用了這個,里面再加上try catch,盡然不崩了。
老中醫可不知道藥里的化學成分,他就是能治好病,這病你可能治不好。
你這個同事也真是人才。。。。
把簡單的代碼復雜化,還不如不并發。
建議讓他好好看看 async await怎么使用。
內部還是wait,有什么用呢。還是一樣要等待。
至于好幾百的并發,就要通過nginx來解決,是不是nginx太掉價了。
正常,你哪怕是不用任何東西,不用task,幾百的并發也是綽綽有余。
上面的代碼,如果真想銹task,那還不如直接 Task().Result
但是這和不用task也就沒區別了。
所以想學技術是好的,但是讓你同事別一知半解銹技巧,
更加別再上線的專案里玩自己一知半解的技巧。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/185150.html
標籤:C#
下一篇:sqlite
