C# N 等待consumerLimiter.WaitAsync(); //得到一个生产的项目。 if(queue.TryDequeue(out var项)) { //告诉制片人他们可以继续生产。 produceLimitor.Release(); //生产出一
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();//通知消费者 } }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
它是如何破坏一切的?因为当它不在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);
});