私はインスタンス化するのに非常に高価なビジネスオブジェクトを持っているとしましょう、私はアプリケーションでそのオブジェクトのインスタンスを10個以上言うことは決してありません。つまり、これは、一度に10以上の並行作業スレッドを実行したくないということです。System.Threading.Tasks.Task内で使用するプライベートオブジェクトインスタンスを作成しますか?
私はこのようなタスクを作成するために、新しいSystem.Threading.Tasksを使用したい:
- 作成:
var task = Task.Factory.StartNew(() => myPrivateObject.DoSomethingProductive());
をする方法を示しますそこにサンプルがありますTaskFactoryで使用するための「オブジェクトプール」?
- TaskFactoryを指定されたスレッド数に制限しますか?
- オブジェクトプール内のインスタンスをロックするので、一度に1つのタスクでしか使用できません。
Igbyの答えはジャスティン・エスリッジからこのexcellent blog postに私を導きました。その後、このサンプルを書くために私を促した:は
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace MyThreadedApplication
{
class Program
{
static void Main(string[] args)
{
// build a list of 10 expensive working object instances
var expensiveStuff = new BlockingCollection<ExpensiveWorkObject>();
for (int i = 65; i < 75; i++)
{
expensiveStuff.Add(new ExpensiveWorkObject(Convert.ToChar(i)));
}
Console.WriteLine("{0} expensive objects created", expensiveStuff.Count);
// build a list of work to be performed
Random r = new Random();
var work = new ConcurrentQueue<int>();
for (int i = 0; i < 1000; i++)
{
work.Enqueue(r.Next(10000));
}
Console.WriteLine("{0} items in work queue", work.Count);
// process the list of work items in fifteen threads
for (int i = 1; i < 15; i++)
{
Task.Factory.StartNew(() =>
{
while (true)
{
var expensiveThing = expensiveStuff.Take();
try
{
int workValue;
if (work.TryDequeue(out workValue))
{
expensiveThing.DoWork(workValue);
}
}
finally
{
expensiveStuff.Add(expensiveThing);
}
}
});
}
}
}
}
class ExpensiveWorkObject
{
char identity;
public void DoWork(int someDelay)
{
System.Threading.Thread.Sleep(someDelay);
Console.WriteLine("{0}: {1}", identity, someDelay);
}
public ExpensiveWorkObject(char Identifier)
{
identity = Identifier;
}
}
だから、私は、オブジェクトプールとしてBlockingCollectionを使用しています、そして、彼らは1以上の排他制御を持ってまで、ワーカースレッドは、使用可能な仕事のためにキューをチェックしません。高価なオブジェクトインスタンスの
限定並行処理スケジューラ
することができます:私は
ジョン、ありがとう、私は私がばかだと気付かなかった。 –
あなたは愚かなことについて誰が言ったのですか? –
私は、Parallel Extensions Samples(http://go.microsoft.com/fwlink/?LinkID=165717)のサンプルを試しています。 –