C# 具有有限并发块的TaskScheduler本身

C# 具有有限并发块的TaskScheduler本身,c#,multithreading,async-await,task-parallel-library,C#,Multithreading,Async Await,Task Parallel Library,我正在尝试使用来限制并发web请求: 我是这样使用它的: const int CONCURRENCY_LEVEL = 2; static void Main() { TaskFactory factory = new TaskFactory(new LimitedConcurrencyLevelTaskScheduler(CONCURRENCY_LEVEL)); Task.WaitAll(new[] { factory.StartNew(() => SomeAction

我正在尝试使用来限制并发web请求:

我是这样使用它的:

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";
    });
}
second task started
first task started
first inner task started
second inner task started
second inner task ended
first inner task ended
当我将
CONCURRENCY\u 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示例中有错误吗?

试试看

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";
    }).ConfigureAwait(false); //<--------
}
静态异步任务另一个任务(字符串任务)
{
返回等待任务。运行(()=>
{
Console.WriteLine(任务+“内部任务已启动”);
//模拟web请求
睡眠(200);
Console.WriteLine(任务+“内部任务已结束”);
返回“ok”;

}).ConfigureAwait(false);//从自定义任务计划程序启动任务时,指定
TaskCreationOptions.HideScheduler

Task.WaitAll(new[] 
{
   factory.StartNew(() => SomeAction("first"),  TaskCreationOptions.HideScheduler), 
   factory.StartNew(() => SomeAction("second"), TaskCreationOptions.HideScheduler)
});
发件人:

HideScheduler
防止环境调度器被视为已创建任务中的当前调度器。这意味着在已创建任务中执行的
StartNew
ContinueWith
等操作将视为当前调度器


是的,它正在工作,但正如我所提到的,我不能更改这段代码。这是一个
HttpClient
的内部任务,是真实代码,我不可能更改它的创建options@Adassko我不明白!为什么你不能执行
httpclient.GetSomeAsync(…).ConfigureAwait(false);
因为这不是我的代码,我只是在调用它。这是来自外部插件库,我希望我的代码能够运行任何类型的代码blocking@Adassko您的外部库应已使用
.ConfigureAwait(false)
它不能假定您是否要将其与工作线程同步。一个错误的编码。@Adassko顺便说一句:您说“我无法在某个操作中更改代码”,而我的更改在另一个任务中:)是的!:)这是我的案例的完美解决方案,非常感谢:)