Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# N 等待consumerLimiter.WaitAsync(); //得到一个生产的项目。 if(queue.TryDequeue(out var项)) { //告诉制片人他们可以继续生产。 produceLimitor.Release(); //生产出一_C#_Multithreading_Async Await - Fatal编程技术网

C# N 等待consumerLimiter.WaitAsync(); //得到一个生产的项目。 if(queue.TryDequeue(out var项)) { //告诉制片人他们可以继续生产。 produceLimitor.Release(); //生产出一

C# N 等待consumerLimiter.WaitAsync(); //得到一个生产的项目。 if(queue.TryDequeue(out var项)) { //告诉制片人他们可以继续生产。 produceLimitor.Release(); //生产出一,c#,multithreading,async-await,C#,Multithreading,Async Await,N 等待consumerLimiter.WaitAsync(); //得到一个生产的项目。 if(queue.TryDequeue(out var项)) { //告诉制片人他们可以继续生产。 produceLimitor.Release(); //生产出一件成品。 等待收益。返回异步(项目); } 其他的 { //如果队列为空,则生产结束。 打破 } } }); e、 ForEachAsync((项,索引)=>Console.WriteLine($“{index+1}:{item}”)).Wai

N 等待consumerLimiter.WaitAsync(); //得到一个生产的项目。 if(queue.TryDequeue(out var项)) { //告诉制片人他们可以继续生产。 produceLimitor.Release(); //生产出一件成品。 等待收益。返回异步(项目); } 其他的 { //如果队列为空,则生产结束。 打破 } } }); e、 ForEachAsync((项,索引)=>Console.WriteLine($“{index+1}:{item}”)).Wait(); } 静态异步任务ProduceAsync(ConcurrentQueue队列、信号量限制produceLimiter、信号量限制consumerLimiter) { var rnd=新随机数(); 对于(变量i=0;i<10;i++) { 等待任务。延迟(10); var值=rnd.Next(); Wait produceLimiter.WaitAsync();//等待下一个生产插槽 queue.Enqueue(value);//在队列上生成项目 consumerLimiter.Release();//通知消费者 } }
它是如何破坏一切的?因为当它不在AsyncEnumerable中时,事情按预期工作,所有的任务都在打印(而不仅仅是任务10)。此外,这个任务不会结束,因为任务1-9永远不会完成,原因我不知道,所以在使用
AsyncEnumerable
时,它只打印
任务10:{number}
?请记住,在措辞问题时,只有你理解问题背后的背景,最好描述问题和预期/预期的解决方案,以帮助我们理解。我想我现在说得更清楚了。我知道这有点不好。。我检查代码的次数多得数不清。。
public static class RetryComponent
{
    public static async Task RunTasks(Func<Task<bool>> action, int tasks, int retries, string method)
    {
        // Running everything
        var tasksPool = Enumerable.Range(0, tasks).Select(i => DoWithRetries(action, retries, method)).ToArray();
        await Task.WhenAll(tasksPool);
    }

    private static async Task<bool> DoWithRetries(Func<Task<bool>> action, int retryCount, string method)
    {
        while (true)
        {
            if (retryCount <= 0)
                return false;

            try
            {
                bool res = await action();
                if (res)
                    return true;
            }
            catch (Exception e)
            {
                // Log it
            }

            retryCount--;
            await Task.Delay(200); // retry in 200
        }
    }
}
BlockingCollection<int> ints = new BlockingCollection<int>();
foreach (int i in Enumerable.Range(0, 100000))
{
    ints.Add(i);
}
ints.CompleteAdding();

int taskId = 0;
var enumerable = new AsyncEnumerable<int>(async yield =>
{
    await RetryComponent.RunTasks(async () =>
    {
        try
        {
            int myTaskId = Interlocked.Increment(ref taskId);

            // usually there are async/await operations inside the while loop, this is just an example

            while (!ints.IsCompleted)
            {
                int number = ints.Take();

                Console.WriteLine($"Task {myTaskId}: {number}");
                await yield.ReturnAsync(number);
            }
        }
        catch (InvalidOperationException)
        {
            return true;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }

        return true;
    }, 10, 1, MethodBase.GetCurrentMethod().Name);
});

await enumerable.ForEachAsync(number =>
{
    Console.WriteLine(number);
});