我試圖用the following custom task scheduler限制併發Web請求:我使用的是像這樣的TaskScheduler有限的併發塊本身
:
const int CONCURRENCY_LEVEL = 2;
static void Main()
{
TaskFactory factory = new TaskFactory(new LimitedConcurrencyLevelTaskScheduler(CONCURRENCY_LEVEL));
Task.WaitAll(new[] { factory.StartNew(() => SomeAction("first")), factory.StartNew(() => SomeAction("second")) });
Console.WriteLine("All tasks ended");
Console.Read();
}
static void SomeAction(string task)
{
Console.WriteLine(task + " task started");
Console.WriteLine(AnotherTask(task).Result);
Console.WriteLine(task + " task ended");
}
static async Task<string> AnotherTask(string task)
{
return await Task.Run(() =>
{
Console.WriteLine(task + " inner task started");
// imitate web requests
Thread.Sleep(200);
Console.WriteLine(task + " inner task ended");
return "ok";
});
}
的問題是,內部任務是使用我的LimitedConcurrencyLevelTaskScheduler
而不是默認的TaskScheduler
。這導致自我閉鎖和輸出是這樣的:
second task started
first task started
first inner task started
second inner task started
second inner task ended
first inner task ended
當我改變CONCURRENCY_LEVEL
到3
或改變factory
到Task.Factory
那顯然一切正常,其輸出是這樣的:
first task started
second task started
first inner task started
second inner task started
second inner task ended
first inner task ended
ok
second task ended
ok
first task ended
All tasks ended
我不能更改SomeAction
中的代碼。我還可以做些什麼? Microsoft示例中是否存在錯誤?
是的! :)這是我的情況的完美解決方案,非常感謝你:) – Adassko 2015-02-07 14:44:24