RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1225817
Accepted
Vladimir
Vladimir
Asked:2021-12-31 00:32:26 +0000 UTC2021-12-31 00:32:26 +0000 UTC 2021-12-31 00:32:26 +0000 UTC

停止后启动线程时的问题

  • 772

大家好,新年快乐。现在,关于这个问题,我正在尝试从YouTube 这里 github重写(从 winform 到 wpf / mvvm)代码:这里,当Stop()线程从Start()停止 时,会发生错误:System.InvalidOperationException: 'Start may不会被要求完成已完成的任务。 在此处输入图像描述

店电脑模型

    /// <summary>
    /// Моделирование работы магазина касс.
    /// </summary>
    public class ShopComputerModel
    {
        Generator Generator = new Generator();
        Random rnd = new Random();
        List<Task> tasks = new List<Task>();
        CancellationTokenSource cancelTokenSource;
        CancellationToken token;
        /// <summary>
        /// Касса
        /// </summary>
        public List<CashDesk> CashDesks { get; set; } = new List<CashDesk>();
        public List<Cart> Carts { get; set; } = new List<Cart>();
        public List<Check> Checks { get; set; } = new List<Check>();
        /// <summary>
        /// Продажы
        /// </summary>
        public List<Sell> Sell { get; set; } = new List<Sell>();
        public Queue<Seller> Sellers { get; set; } = new Queue<Seller>();

        public int CustomerSpeed { get; set; } = 100;
        public int CashDeskSpeed { get; set; } = 100;

        public ShopComputerModel()
        {   
            var sellers = Generator.GetNewSellers(20);
            Generator.GetNewProducts(1000);
            Generator.GetNewCustomers(100);

            cancelTokenSource = new CancellationTokenSource();
            token = cancelTokenSource.Token;

            foreach (var seller in sellers)
            {
                Sellers.Enqueue(seller);
            }

            for(int i = 0; i < 3; i++)
            {
                CashDesks.Add(new CashDesk(CashDesks.Count, Sellers.Dequeue()));
            }
        }

        public void Start()
        {
            #region Синхронное выполные
            //var customers = Generator.GetNewCustomers(10);
            ////Заполные козины
            //var carts = new Queue<Cart>();
            //foreach (var customer in customers)
            //{
            //    var cart = new Cart(customer);

            //    foreach (var prod in Generator.GetRandomProducts(10, 30))
            //    {
            //        cart.Add(prod);
            //    }

            //    carts.Enqueue(cart);
            //}



            //while (carts.Count > 0)
            //{
            //    var cash = CashDesks[rnd.Next(CashDesks.Count - 1)];//случайная касса
            //    cash.Enqueue(carts.Dequeue());//Будем распределять покупателей по одной из 3 класс.
            //}
            
            //while (true)//Обслуживаные в кассе людей
            //{
            //    var cash = CashDesks[rnd.Next(CashDesks.Count - 1)];
            //    var money = cash.Dequeue();
            //}
            #endregion

            #region Асинхронные выполные
            tasks.Add(new Task(() => CreateCarts(10, token)));
            tasks.AddRange(CashDesks.Select(c => new Task(() => CashDeskWork(c, token))));
            foreach (var task in tasks)
            {
                task.Start();
            }
            #endregion
        }

        public void Stop()
        {
            cancelTokenSource.Cancel();
            Thread.Sleep(1000);
        }

        private void CashDeskWork(CashDesk cashDesk, CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {   //Если человек есть в очереде,тогда облужаем его.
                if (cashDesk.Count > 0)
                {
                    cashDesk.Dequeue();
                    Thread.Sleep(CashDeskSpeed);
                }
            }
        }

        private void CreateCarts(int customerCounts, CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {
                var customers = Generator.GetNewCustomers(customerCounts);

                foreach (var customer in customers)
                {
                    var cart = new Cart(customer);
                    //Заполненные корзину продуктами.
                    foreach (var product in Generator.GetRandomProducts(10, 30))
                    {
                        cart.Add(product);
                    }
                    //Клиент будет выбирать из случайных очередей.
                    var cash = CashDesks[rnd.Next(CashDesks.Count)];
                    cash.Enqueue(cart);
                }

                Thread.Sleep(CustomerSpeed);
            }
        }
    }

发电机

/// <summary>
///Будет создавать виртуальные объекты(для системы сrm).
/// </summary>
public class Generator
{
    Random rnd = new Random();
    public List<Customer> Customers { get; set; } = new List<Customer>();
    public List<Product> Products { get; set; } = new List<Product>();
    public List<Seller> Sellers { get; set; } = new List<Seller>();
    /// <summary>
    /// Генерирование покупателей.
    /// </summary>
    /// <param name="count"></param>
    /// <returns></returns>
    public List<Customer> GetNewCustomers(int count)
    {
        var result = new List<Customer>();

        for(int i = 0; i < count; i++)
        {
            var customer = new Customer()
            {
                CustomerId = Customers.Count,
                Name = GetRandomText(),
                Password= GetRandomText()
            };
            Customers.Add(customer);
            result.Add(customer);
        }

        return result;
    }
    /// <summary>
    ///Генерирование продавцов.
    /// </summary>
    /// <param name="count"></param>
    /// <returns></returns>
    public List<Seller> GetNewSellers(int count)
    {
        var result = new List<Seller>();

        for (int i = 0; i < count; i++)
        {
            var seller = new Seller()
            {
                SellerId = Sellers.Count,
                Name = GetRandomText()
            };
            Sellers.Add(seller);//будем сохранить продавцов
            result.Add(seller);//тут будем возвращать продавцов
        }

        return result;
    }
    /// <summary>
    /// Генерирование товаров.
    /// </summary>
    /// <param name="count"></param>
    /// <returns></returns>
    public List<Product> GetNewProducts(int count)
    {
        var result = new List<Product>();

        for (int i = 0; i < count; i++)
        {
            var product = new Product()
            {
                ProductId = Products.Count,
                Name = GetRandomText(),
                Count = rnd.Next(10, 1000),
                Price = Convert.ToDecimal(rnd.Next(5, 100000) +  rnd.NextDouble())
            };
            Products.Add(product);
            result.Add(product);
        }

        return result;
    }
    /// <summary>
    /// Полученые товаров какие есть уже
    /// </summary>
    /// <param name="min"></param>
    /// <param name="max"></param>
    /// <returns></returns>
    public List<Product> GetRandomProducts(int min, int max)
    {
        var result = new List<Product>();

        var count = rnd.Next(min, max);//будем получать счуйное количество товаров
        for(int i = 0; i < count; i++)
        {
            result.Add(Products[rnd.Next(Products.Count - 1)]);
        }
        return result;
    }

    private static string GetRandomText()
    {
        return Guid.NewGuid().ToString().Substring(0, 5);
    }
}
c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    VladD
    2021-12-31T00:42:17Z2021-12-31T00:42:17Z

    List<Task> tasks = new List<Task>();完成任务后您的列表不为空。在第二次执行该函数Start时,列表中仍有旧的已完成任务。

    • 3

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5