我創建了一個包含BlockingCollection的簡單類。它代表將按照接收順序執行的一系列操作。我已經閱讀了很多關於TPL的文章,似乎我應該使用它而不是我目前使用的文章。原因之一是單元測試會更容易,代碼也會寫得更少。我知道你可以使用Task.Factory.StartNew()等方法輕鬆完成新的任務,但不知道如何以類似的方式使用它,就像我現在擁有的類一樣。我如何用TPL完成同樣的事情?如何在TPL中實現與BlockingCollection類似的功能?
按照要求,這裏是我創建的類:創建簡單的生產者 - 消費者的場景
public class MyService
{
/// <summary>Queue of actions to be consumed on a separate thread</summary>
private BlockingCollection<MyObject> queue = new BlockingCollection<MyObject>();
public MyService()
{
StartService();
}
public void AddToQueue(MyObject newObject)
{
queue.Add(newObject);
}
private void StartService()
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
while (true)
{
try
{
MyObject myObject = queue.Take(); // blocks until new object received
// Do work...
}
catch (Exception e)
{
// Log...
}
}
});
}
}
如果你沒有正確地使用'StartNew',請小心[當你不希望它在UI線程上運行時](http://blog.stephencleary.com/2013/ 08/startnew-is-dangerous.html),使用'Task.Run(',除非你有特定的理由使用'StartNew'。另外,給你一個總體的方向推動(我不知道這是否是你需要的),但是請看[TPL DataFlow](https://msdn.microsoft.com/en-us/library/hh228603(v = vs.110).aspx)。 –
你可以給出一個代碼示例你想要做什麼? – Coding4Fun
我剛剛添加了代碼,以使其更清晰。 – Andrew