[英]Task running few seconds after the call
我有一個接收消息的服務,將收到的每條消息發送給一個實例,然后將其發送給新Task,因此消息的處理操作將是異步的
public void ReceiveMessage(string Message) {
Logger.Logger.Log($"Receive Message {Message} in METHOD method");
//see in the log time stamp 12:13:51.000
Task.Factory.StartNew(() =>
{
Logger.Logger.Log($"Receive Message {Message} in TASK method");
//see in the log time stamp 112:13:53.000
processMessage(Message);
});
}
private void processMessage(string message) {
//do some processing job
}
服務中從不同的客戶端收到很多消息,每條消息發送到不同的實例, ReceiveMessage
和processMessage
是每個實例的方法,因此在調用方法和啟動任務之間有2秒的延遲-有誰知道為什么這可能會發生,如何避免呢?
我以為C#能夠管理自己的線程池...
可以同時運行的Task數量有限,請檢查Task.Factory.Scheduler.MaximumConcurrencyLevel
的屬性
任務並行庫和PLINQ的默認調度程序使用ThreadPool類表示的.NET Framework線程池來排隊和執行工作。 線程池使用Task類型提供的信息來有效地支持並行任務和查詢經常表示的細粒度並行性(短期工作單元)。
但是, ThreadPool
池的大小取決於幾個因素:
每個進程只有一個線程池。 從.NET Framework 4開始,進程的線程池的默認大小取決於幾個因素,例如虛擬地址空間的大小。 進程可以調用GetMaxThreads方法來確定線程數。 可以使用SetMaxThreads方法更改線程池中的線程數。 每個線程使用默認堆棧大小,並以默認優先級運行。
TheadPool- https: //msdn.microsoft.com/zh-CN/library/system.threading.threadpool.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.