为什么我的任务不会 运行 在 c# 控制台应用程序中?
Why my tasks won't run in c# console application?
我制作了一个简单的生产者-消费者控制台应用程序,其中有两个消费者和一个生产者。我正在检查一些随机数是否可以被 3 或 5 整除。
代码如下:
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace ProducerConsumer
{
class Program
{
public class OneProducerTwoConsumer
{
private readonly BlockingCollection<int> randomNumbersForDivisibleByFive = new BlockingCollection<int>(10);
private readonly BlockingCollection<int> randomNumbersForDivisibleByThree = new BlockingCollection<int>(10);
private int numberOfDivisibleByFive = 0;
private int numberOfDivisibleByThree = 0;
private void Producer()
{
int numberOfNumbers = 50;
Random random = new Random();
for (int i = 0; i < numberOfNumbers; i++)
{
var randomNumber = random.Next();
randomNumbersForDivisibleByFive.Add(randomNumber);
randomNumbersForDivisibleByThree.Add(randomNumber);
}
}
private void ConsumerDivisibleByFive()
{
foreach (int randomNumber in randomNumbersForDivisibleByFive.GetConsumingEnumerable())
{
if(randomNumber % 5 == 0)
{
numberOfDivisibleByFive++;
Console.WriteLine($"{randomNumber} is divisible by 5");
}
else
{
Console.WriteLine($"{randomNumber} is not divisible by 5");
}
}
Console.WriteLine($"There are {numberOfDivisibleByFive} numbers divisible by 5 generated from the producer");
}
private void ConsumerDivisibleByThree()
{
foreach (int randomNumber in randomNumbersForDivisibleByThree.GetConsumingEnumerable())
{
if (randomNumber % 3 == 0)
{
numberOfDivisibleByThree++;
Console.WriteLine($"{randomNumber} is divisible by 3");
}
else
{
Console.WriteLine($"{randomNumber} is not divisible by 3");
}
}
Console.WriteLine($"There are {numberOfDivisibleByThree} numbers divisible by 3 generated from the producer");
}
public void RunTasks()
{
var producingTask = Task.Run(() => Producer());
var divisibleByFiveTask = Task.Run(() => ConsumerDivisibleByFive());
var divisibleByThreeTask = Task.Run(() => ConsumerDivisibleByThree());
producingTask.Start();
divisibleByFiveTask.Start();
divisibleByThreeTask.Start();
}
}
public static void Main(string[] args)
{
OneProducerTwoConsumer oneProducerTwoConsumer = new OneProducerTwoConsumer();
oneProducerTwoConsumer.RunTasks();
}
}
}
但是,当我 运行 控制台上没有任何代码显示时,我发现我的代码没有任何问题。
感谢任何帮助!
改变这个:
public void RunTasks()
{
var producingTask = Task.Run(() => Producer());
var divisibleByFiveTask = Task.Run(() => ConsumerDivisibleByFive());
var divisibleByThreeTask = Task.Run(() => ConsumerDivisibleByThree());
producingTask.Start();
divisibleByFiveTask.Start();
divisibleByThreeTask.Start();
}
为此:
public void RunTasks()
{
var producingTask = Task.Run(() => Producer());
var divisibleByFiveTask = Task.Run(() => ConsumerDivisibleByFive());
var divisibleByThreeTask = Task.Run(() => ConsumerDivisibleByThree());
Task.WaitAll(producingTask, divisibleByFiveTask, divisibleByThreeTask);
// or:
// Task.WhenAll(producingTask, divisibleByFiveTask, divisibleByThreeTask).GetAwaiter().GetResult();
}
执行Task.Run()
时任务关闭运行。执行他们的 Start
方法对您正在做的事情没有影响。
至于修复:通过“等待”任务完成,您允许任务在程序退出之前完成。
我制作了一个简单的生产者-消费者控制台应用程序,其中有两个消费者和一个生产者。我正在检查一些随机数是否可以被 3 或 5 整除。
代码如下:
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace ProducerConsumer
{
class Program
{
public class OneProducerTwoConsumer
{
private readonly BlockingCollection<int> randomNumbersForDivisibleByFive = new BlockingCollection<int>(10);
private readonly BlockingCollection<int> randomNumbersForDivisibleByThree = new BlockingCollection<int>(10);
private int numberOfDivisibleByFive = 0;
private int numberOfDivisibleByThree = 0;
private void Producer()
{
int numberOfNumbers = 50;
Random random = new Random();
for (int i = 0; i < numberOfNumbers; i++)
{
var randomNumber = random.Next();
randomNumbersForDivisibleByFive.Add(randomNumber);
randomNumbersForDivisibleByThree.Add(randomNumber);
}
}
private void ConsumerDivisibleByFive()
{
foreach (int randomNumber in randomNumbersForDivisibleByFive.GetConsumingEnumerable())
{
if(randomNumber % 5 == 0)
{
numberOfDivisibleByFive++;
Console.WriteLine($"{randomNumber} is divisible by 5");
}
else
{
Console.WriteLine($"{randomNumber} is not divisible by 5");
}
}
Console.WriteLine($"There are {numberOfDivisibleByFive} numbers divisible by 5 generated from the producer");
}
private void ConsumerDivisibleByThree()
{
foreach (int randomNumber in randomNumbersForDivisibleByThree.GetConsumingEnumerable())
{
if (randomNumber % 3 == 0)
{
numberOfDivisibleByThree++;
Console.WriteLine($"{randomNumber} is divisible by 3");
}
else
{
Console.WriteLine($"{randomNumber} is not divisible by 3");
}
}
Console.WriteLine($"There are {numberOfDivisibleByThree} numbers divisible by 3 generated from the producer");
}
public void RunTasks()
{
var producingTask = Task.Run(() => Producer());
var divisibleByFiveTask = Task.Run(() => ConsumerDivisibleByFive());
var divisibleByThreeTask = Task.Run(() => ConsumerDivisibleByThree());
producingTask.Start();
divisibleByFiveTask.Start();
divisibleByThreeTask.Start();
}
}
public static void Main(string[] args)
{
OneProducerTwoConsumer oneProducerTwoConsumer = new OneProducerTwoConsumer();
oneProducerTwoConsumer.RunTasks();
}
}
}
但是,当我 运行 控制台上没有任何代码显示时,我发现我的代码没有任何问题。
感谢任何帮助!
改变这个:
public void RunTasks()
{
var producingTask = Task.Run(() => Producer());
var divisibleByFiveTask = Task.Run(() => ConsumerDivisibleByFive());
var divisibleByThreeTask = Task.Run(() => ConsumerDivisibleByThree());
producingTask.Start();
divisibleByFiveTask.Start();
divisibleByThreeTask.Start();
}
为此:
public void RunTasks()
{
var producingTask = Task.Run(() => Producer());
var divisibleByFiveTask = Task.Run(() => ConsumerDivisibleByFive());
var divisibleByThreeTask = Task.Run(() => ConsumerDivisibleByThree());
Task.WaitAll(producingTask, divisibleByFiveTask, divisibleByThreeTask);
// or:
// Task.WhenAll(producingTask, divisibleByFiveTask, divisibleByThreeTask).GetAwaiter().GetResult();
}
执行Task.Run()
时任务关闭运行。执行他们的 Start
方法对您正在做的事情没有影响。
至于修复:通过“等待”任务完成,您允许任务在程序退出之前完成。