Понимание вопроса C # Threading - PullRequest
0 голосов
/ 24 января 2019

Мне недавно задали вопрос безопасности потока в интервью c #. Я не совсем понял. Я пытаюсь понять это сейчас. Вот вопрос ...

Учитывая базовый класс заказа ...

using System;

namespace OrderThreadTest
{
    public class Order
    {
        public TimeSpan CancelTime;
        public int Id;
    }
}

Учитывая простую заглушку класса расписания, я реализовал ее для тестирования дома ...

using System;
using System.Threading;

namespace OrderThreadTest
{
    public class Scheduler : IDisposable
    {
        private Timer _timer;

        public IDisposable Schedule(Order order, Action action)
        {
            var current = DateTime.Now;
            var timeToGo = order.CancelTime - current.TimeOfDay;

            _timer = new Timer(x => { action(); }, null, timeToGo, Timeout.InfiniteTimeSpan);

            return this;
        }

        public void Dispose()
        {
        }
    }
}

Как вы гарантируете, что метод Cancel в рабочем классе является поточно-ориентированным? Мой ответ - закомментированные фрагменты

using System;

namespace OrderThreadTest
{
    public class Answer
    {
        private readonly Scheduler _scheduler;
        private object _myLock = new object();
        private Order _order;

        public Answer(Scheduler scheduler)
        {
            _scheduler = scheduler;
        }

        public void Cancel(Order order)
        {
            //  lock (_myLock)
            //  {
            // _order = order;
            //  var result =
            _scheduler.Schedule(order, () =>
            {
                //if (order.Equals(_order))
                //{
                Console.WriteLine("Canceled: " + order.Id);
                order = null;
                //}
            });
            //  }
        }
    }
}

Мой первый вопрос в понимании этого состоит в том, как я могу привести пример второго потока, устанавливающего переданный в порядке и изменяющий более ранний таймер? Например, вызвать конфликт данных потока.

Я пробовал вот так, но, кажется, всегда работает как ожидалось ...

using System;

namespace OrderThreadTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var a1 = new Answer(new Scheduler());

            var o = new Order
                {Id = 1, CancelTime = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second + 5)};

            a1.Cancel(o);

            a1.Cancel(o);

            Console.ReadLine();
        }
    }
}

Как мне воспроизвести проблему, которую я собираюсь решить здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...