簡體   English   中英

為什么我的任務無法在 c# 控制台應用程序中運行?

[英]Why my tasks won't run in c# console application?

我制作了一個簡單的生產者-消費者控制台應用程序,其中有兩個消費者和 1 個生產者。 我正在檢查一些隨機數是否可以被 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方法對您正在做的事情沒有影響。

至於修復:通過“等待”任務完成,您允許任務在程序退出之前完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM